Valgrind无法检测到全局指针的内存泄漏。

6

我正在运行valgrind --leak-check=full test.cpp命令,对以下代码进行检测。

#include <iostream>

int* p = new int[42]; // no leak reported

int main() 
{
    p[0] = 42; // use it
    std::cout << p[0];
}

而且没有泄漏报告:

==37293== LEAK SUMMARY:
==37293==    definitely lost: 0 bytes in 0 blocks
==37293==    indirectly lost: 0 bytes in 0 blocks
==37293==      possibly lost: 0 bytes in 0 blocks

每当我将定义 int* p = new int[42]; 移到 main() 内部,使它具有自动存储期,valgrind 都会检测到内存泄漏。为什么它不会检测静态存储期对象的泄漏?我是否漏掉了什么?

我很好奇你是否在main()函数开始之前就看到了valgrind报告中的任何内存泄漏,而不仅仅是这个例子?我不知道它何时开始监视,但在main()函数中加入钩子似乎是一个合理的选择。 - WhozCraig
@WhozCraig 实际上我刚开始使用valgrind(在OS X上,之前用过Instruments,因为Yosemite没有版本),只是在玩它。 - vsoftco
好羡慕啊,我的还没在Yosemite上跑起来。我猜你没有写过关于设置它的博客吧 =P?(我知道这只是一厢情愿的想法)。 - WhozCraig
@WhozCraig 只需使用MacPorts并通过sudo port install valgrind-devel安装valgrind-devel即可;) 简单易行。非devel版本仍然不兼容,但devel版本可以正常工作。 - vsoftco
呵呵。谢谢你。在MacPorts、xcode-select和valgrind-devel(因此包括automake、libtool等)之间,我的av-autoscan刚刚经历了一次艰苦的锻炼。但它已经安装好了,看起来很不错。再次感谢。 - WhozCraig
1个回答

6

这些内存块仍然可以访问,因此不被视为泄漏。如果您想显示可访问的块,请使用--leak-check=full --show-leak-kinds=all参数运行valgrind。

一般来说,这种“泄漏”并不是bug。在您的示例代码中,没有“正确的位置”来放置相应的delete


得记下来了。谢谢。 - WhozCraig

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