为啥 QApplication 会出现内存泄漏?

Posted

技术标签:

【中文标题】为啥 QApplication 会出现内存泄漏?【英文标题】:Why does QApplication give memory leaks?为什么 QApplication 会出现内存泄漏? 【发布时间】:2014-01-10 06:25:07 【问题描述】:

我有一个简单的代码:

#include <QApplication>

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    return 0;

我在 Qt Creator 中使用 pro 文件编译它:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = testLeaks
TEMPLATE = app


SOURCES += main.cpp

HEADERS  +=

FORMS    +=

命令valgrind ./testLeaks 说明泄漏并打印以下内容:

==31276== HEAP SUMMARY:
==31276==     in use at exit: 1,190,544 bytes in 7,267 blocks
==31276==   total heap usage: 46,096 allocs, 38,829 frees, 6,716,079 bytes allocated
==31276== 
==31276== LEAK SUMMARY:
==31276==    definitely lost: 2,788 bytes in 11 blocks
==31276==    indirectly lost: 7,065 bytes in 182 blocks
==31276==      possibly lost: 318,238 bytes in 1,233 blocks
==31276==    still reachable: 862,453 bytes in 5,841 blocks
==31276==         suppressed: 0 bytes in 0 blocks

如果我评论 QApplication,则没有泄漏。为什么这个类会泄漏?

【问题讨论】:

qt 5.2.0 和 qt creator 3.0.0 相同,但我得到:==3005== 错误摘要:0 个上下文中的 0 个错误(抑制:2 个来自 2 个)。我想你跳过了那部分。顺便说一句,我认为 320KB+ 的“可能”丢失并没有那么糟糕,它甚至可能来自一些潜在的依赖。我想这需要更彻底的自省,最好是运行一些静态分析器。 :) 另外,最好使用valgrind --leak-check=full --show-leak-kinds=all -v ./testLeaks 我没有使用过 valgrind,但至少从我在 Windows 上发现 Qt 泄漏的工作来看——Qt 中有很多静态对象,所以如果在内存快照被销毁之前拍摄内存快照,那么内存可能出现泄漏。 我想在这里发布 --leak-check=full 显示的内容,但它显示了很多文本,因此我决定不在这里发布。实际上在开始时 valgrind 提到了 /lib/x86_64-linux-gnu/ld-2.17.so 中的一些问题。自从我将 libc6 更新到 2.17 以来,它就已经开始了。这可能是泄漏的原因吗? 【参考方案1】:

如 cmets 中所述,以下命令提供了更多信息:

valgrind --leak-check=full --show-leak-kinds=all -v ./testLeaks

另外,你剪掉了短输出的结尾:

==3005== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2).

无论哪种方式,它很可能不是 QApplication 本身的错误,而是一些潜在的依赖关系,特别是您提到它会在 libc 更新之后发生。

我在使用 libc 和其他低级库时遇到了几个问题,您认为它们不会泄漏内存,最终您会感到惊讶。

这可以通过使用该库编写一个示例来轻松检查。

但是,由于它只有大约 320K+ 并且 Qt 应用程序(尤其是 GUI)需要更多,我不会认为这是一个不可忽略的数量。

【讨论】:

错误摘要:来自 5 个上下文的 5 个错误(抑制:0 来自 0)

以上是关于为啥 QApplication 会出现内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

为啥将按钮添加为子视图时会出现内存泄漏?

为啥.NET 没有内存泄漏?

为啥苹果提供的 SimpleFTPSample 会泄漏内存?

为啥 pthread 会导致内存泄漏

为啥基于 TComponent 的接口实现会泄漏内存?

为啥存档时我的 NSURLResponse 会泄漏内存?