C++ 了解消毒剂输出

C++ 了解消毒剂输出,c++,gcc,memory-leaks,leak-sanitizer,C++,Gcc,Memory Leaks,Leak Sanitizer,我在我的程序中使用了g++中的AddressSanitizer,我在理解和执行某些输出时遇到了困难 我以前使用过g++-4.8.4,我很确定没有泄漏报告,但我最近切换到了g++-5.2.1,现在我有了新的错误报告。我想gcc5已经好起来了 然而,其中一些是相当神秘的,比如: ==8192==ERROR: LeakSanitizer: detected memory leaks Direct leak of 6960 byte(s) in 174 object(s) allocated from

我在我的程序中使用了g++中的AddressSanitizer,我在理解和执行某些输出时遇到了困难

我以前使用过g++-4.8.4,我很确定没有泄漏报告,但我最近切换到了g++-5.2.1,现在我有了新的错误报告。我想gcc5已经好起来了

然而,其中一些是相当神秘的,比如:

==8192==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 6960 byte(s) in 174 object(s) allocated from:
    #0 0x7f4a73eac5b1 in __interceptor_calloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x945b1)
    #1 0x7f4a3ccd1d81  (/usr/lib/x86_64-linux-gnu/dri/i965_dri.so+0x27ad81)

Direct leak of 2560 byte(s) in 4 object(s) allocated from:
    #0 0x7f4a73eac76a in realloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x9476a)
    #1 0x7f4a53c34839  (/usr/lib/x86_64-linux-gnu/libfontconfig.so.1+0x1b839)

Direct leak of 2144 byte(s) in 57 object(s) allocated from:
    #0 0x7f4a73eac44a in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x9444a)
    #1 0x7f4a5f242b7c  (/usr/lib/x86_64-linux-gnu/libxcb.so.1+0xbb7c)
下一个更清楚:

Direct leak of 512 byte(s) in 1 object(s) allocated from:
    #0 0x7f4a73ead1ba in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x951ba)
    ... more lines pinpointing the issue in a file and the call stack.
前三份报告是否与后一份报告关联?如果他们是独立的,有没有办法找出问题所在


谢谢。

==8192=
:PID

6960字节的直接泄漏
:此报告的总泄漏内存

在174个对象中
:共享同一堆栈跟踪(或堆栈跟踪的一部分)的不同分配数(可以是循环中的分配)

from:#0[…]
:堆栈跟踪

这是一个愚蠢的解释这里是什么

您可能想知道的是:您泄漏的所有内容似乎都在
i965_dri.so
、Linux上的intel userland图形驱动程序以及其他X.org共享对象中。如果您不释放一些openGL/GLX资源,泄漏可能来自您的代码,或者由Leaksanizer计算为泄漏,但由intel驱动程序管理(可能作为缓存或分配池)

我要寻找的第一件事是openGL资源,它们在程序结束时仍然处于活动状态,并释放它们。如果使用渲染或库(如Qt/…),则可能会保留一些已分配的资源


是否正确关闭分配的窗口,释放光标

我确实在使用Qt,它会产生误报吗?感谢您指出OpenGL部分,这就是我所缺少的。是否有一种方法可以准确地指出至少哪些是未分配的?代码库相当大,我还没有编写它,所以感觉有点像大海捞针。你可以尝试通过创建一个空的qt应用程序(只有初始化和反初始化)来隔离问题,看看它是否泄漏。另一个工具,
valgrind
memcheck
)可以帮助您查看它是否真的泄漏了,如果它仍然可以到达。但是,是的,如果Qt保留了一些内存而从未释放它(虽然不是泄漏,但在程序生命周期中为某种目的创建了某种类型的池或对象),我也不会感到惊讶。这是一个非常相互关联的问题:关于
Qt
valgrind