QProgressBar::setValue(int) 会导致内存泄漏

QProgressBar::setValue(int) causes a memory leak?

本文关键字:泄漏 内存 setValue int QProgressBar      更新时间:2023-10-16

我正在使用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给我提示。