17

我正在尝试使用 Qt/C++ 调试大型应用程序构建,而 valgrind 报告内部 Qt 内容存在大量内存泄漏。任何人都可以为 Qt 应用程序共享一个适当的 valgrind 抑制文件吗?

谢谢 !

例如。

#include <qobject.h>
int main()
{
  QObject o;
  return 0;
}

返回:

$ valgrind --leak-check=full --show-reachable=yes ./leak
==12655== Memcheck,内存错误检测器
==12655== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward 等人。
==12655== 使用 Valgrind-3.5.0-Debian 和 LibVEX;使用 -h 重新运行以获取版权信息
==12655== 命令:./leak
==12655==
==12655==
==12655== 堆摘要:
==12655== 退出时使用:7 个块中的 744 个字节
==12655== 总堆使用量:28 次分配,21 次释放,1,640 字节分配
==12655==
==12655== 1 个块中的 16 个字节在丢失记录 1 of 7 中仍然可以访问
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220)
==12655== 0x6203124:QThreadData::current()(在 /usr/lib/libQtCore.so.4.5.2 中)
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (在/usr/lib/libQtCore.so.4.5.2)
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak)
==12655==
==12655== 1 个块中的 96 个字节在丢失记录 2 of 7 中仍然可以访问
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220)
==12655== by 0x62030FC: QThreadData::current() (在/usr/lib/libQtCore.so.4.5.2)
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (在/usr/lib/libQtCore.so.4.5.2)
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak)
==12655==
==12655== 1 个块中的 96 个字节在丢失记录 3 of 7 中仍然可以访问
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220)
==12655== by 0x62041CD: QWaitCondition::QWaitCondition() (在/usr/lib/libQtCore.so.4.5.2)
==12655== 由 0x6200EAF: ??? (在 /usr/lib/libQtCore.so.4.5.2 中)
==12655== 由 0x62010A0: ??? (在 /usr/lib/libQtCore.so.4.5.2 中)
==12655== by 0x6203132: QThreadData::current() (在/usr/lib/libQtCore.so.4.5.2)
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (在/usr/lib/libQtCore.so.4.5.2)
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak)
==12655==
==12655== 1 个块中的 120 个字节在丢失记录 4 of 7 中仍然可以访问
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220)
==12655== by 0x61FE681: QMutex::QMutex(QMutex::RecursionMode) (在/usr/lib/libQtCore.so.4.5.2)
==12655== 0x6200DC8:QThreadData::QThreadData(int)(在 /usr/lib/libQtCore.so.4.5.2 中)
==12655== by 0x620310C: QThreadData::current() (在/usr/lib/libQtCore.so.4.5.2)
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (在/usr/lib/libQtCore.so.4.5.2)
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak)
==12655==
==12655== 1 个块中的 120 个字节在丢失记录 5 of 7 中仍然可以访问
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220)
==12655== by 0x61FE681: QMutex::QMutex(QMutex::RecursionMode) (在/usr/lib/libQtCore.so.4.5.2)
==12655== 0x6200DE9:QThreadData::QThreadData(int)(在 /usr/lib/libQtCore.so.4.5.2 中)
==12655== by 0x620310C: QThreadData::current() (在/usr/lib/libQtCore.so.4.5.2)
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (在/usr/lib/libQtCore.so.4.5.2)
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak)
==12655==
==12655== 1 个块中的 120 个字节在丢失记录 6 of 7 中仍然可以访问
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220)
==12655== by 0x61FE681: QMutex::QMutex(QMutex::RecursionMode) (在/usr/lib/libQtCore.so.4.5.2)
==12655== 由 0x6200E77: ??? (在 /usr/lib/libQtCore.so.4.5.2 中)
==12655== 由 0x62010A0: ??? (在 /usr/lib/libQtCore.so.4.5.2 中)
==12655== by 0x6203132: QThreadData::current() (在/usr/lib/libQtCore.so.4.5.2)
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (在/usr/lib/libQtCore.so.4.5.2)
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak)
==12655==
==12655== 1 个块中的 176 个字节在丢失记录 7 of 7 中仍然可以访问
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220)
==12655== 由 0x6201092: ??? (在 /usr/lib/libQtCore.so.4.5.2 中)
==12655== by 0x6203132: QThreadData::current() (在/usr/lib/libQtCore.so.4.5.2)
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (在/usr/lib/libQtCore.so.4.5.2)
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak)
==12655==
==12655== 泄漏摘要:
==12655== 肯定丢失:0 个块中的 0 个字节
==12655== 间接丢失:0 个块中的 0 个字节
==12655== 可能丢失:0 个块中的 0 个字节
==12655== 仍然可以访问:7 个块中的 744 个字节
==12655== 抑制:0 个块中的 0 个字节
==12655==
==12655== 对于检测到和抑制的错误计数,重新运行:-v
==12655== 错误摘要:0 个上下文中的 0 个错误(抑制:8 个来自 8 个)
4

3 回答 3

5

--show-reachable 显示实际上没有泄漏的内存,即使 valgrind 称其为丢失记录。您的测试应用程序不会泄漏任何内存。

对于这种特殊情况,您不需要任何 valgrind 抑制。对于其他人,也许,但您应该使用 valgrind 的 --gen-suppressions 选项为您生成这些抑制。

于 2009-10-20T13:37:40.103 回答
3
still reachable: 744 bytes in 7 blocks

如果你释放 QObject o? 仍然有相同的结果吗?

更新:澄清一下,当您关闭应用程序时,操作系统将释放此内存(因此它不是泄漏)。

但是,为了您自己,编写一个释放内存的析构函数总是好的,并且知道您可以控制分配和释放的内容总是很高兴。(所以你最终不会遇到真正的内存泄漏......)

于 2009-10-20T12:22:50.973 回答
1

上面的 valgrind 日志报告 0 个泄漏,即没有错误。

于 2009-10-20T12:11:02.140 回答