为什么 QApplication 会导致内存泄漏?

4

我有一段简单的代码:

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    return 0;
}

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

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 - user2717575
一样的问题,但我得到了:==3005== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)。我想你跳过了那部分。顺便说一句,我认为320KB+的“可能”损失并不算太糟糕,甚至可能来自某些底层依赖关系。我想这需要更彻底的内省,最好使用一些静态分析工具。 :) 另外,最好使用 valgrind --leak-check=full --show-leak-kinds=all -v ./testLeaks - László Papp
我没有使用过Valgrind,但至少从我的工作中发现在Windows上查找Qt中的泄漏 - Qt中有很多静态对象,因此如果在它们被销毁之前拍摄内存快照,则该内存可能会出现泄漏。 - Rudolfs Bundulis
我想在这里发布--leak-check=full所显示的内容,但它显示了太多文本,因此我决定不在这里发布。实际上,在开始时,valgrind会指出/lib/x86_64-linux-gnu/ld-2.17.so中存在一些问题。自从我将libc6更新到2.17以来,它就开始了。这可能是泄漏的原因吗? - user2717575
1个回答

1

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

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个) - user2717575

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接