QProgressBar::setValue(int) 会导致内存泄漏
QProgressBar::setValue(int) causes a memory leak?
我正在使用Qt 5.7作为带有QProgressBar的GUI应用程序。我怀疑可能存在内存泄漏,因为内存使用量在运行时增加约 50MB/s。我可以将问题缩小到一行代码。
QProgressBar *pbarQuality;
...
int curQuality = data.getQuality();
if (curQuality < 0) {
curQuality = 0;
qWarning("Value set to 0. ");
}
if (curQuality > 100) {
curQuality = 100;
qWarning("Value set to 100. ");
}
ui.pbarQuality->setValue(curQuality); //The memory problem doesn't occur when this single line is commented out
QProgressBar(pbarQuality( 的值仅用于显示。它没有在其他任何地方使用。
我觉得这是一种非常奇怪的行为。我错过了什么吗?
以下是Qt设计器自动生成的代码:
pbarQuality = new QProgressBar(frame_5);
pbarQuality->setObjectName(QStringLiteral("pbarQuality"));
pbarQuality->setGeometry(QRect(10, 50, 130, 23));
pbarQuality->setValue(24);
尝试用
pbarQuality.update(); QCoreApplication::processEvents();
替换setValue
,看看是否重现问题。如果是这样,那么您正在利用嵌套事件循环在阻塞代码运行时保持 GUI 响应,这是一件坏事。 setValue
调用processEvents
作为解决损坏的用户代码的幼稚方法。恕我直言,这是一个危险的恩惠。然后,唯一的解决方法是取消中断代码并将控制权返回到主事件循环,而不是阻塞。
这个答案展示了如何通过利用QImage
的RAII行为来避免图像风暴的影响,并链接到另一个答案,该答案演示了通过利用OpenGL进行自由图像缩放。
我的应用程序运行 GUI 线程之外的另一个线程,该线程定期(每秒最多 60 次(向 GUI 线程发送信息(图像(。我正在 GUI 线程中进行一些小的图像编辑(调整大小(。事实证明,为了跟上其他线程发布的数据,这需要很长时间。因此,事件队列变得越来越大,使用的 RAM 也越来越大。
经验教训:如果定期发布数据,请注意线程的处理速度。在新数据可用之前,需要进行数据处理。
感谢@KubaOber给我提示。
相关文章:
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存