【问题标题】:Valgrind does not detect leak in global pointerValgrind 未检测到全局指针中的泄漏
【发布时间】:2023-12-12 23:19:01
【问题描述】:

我在下面的代码上运行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 就会检测到内存泄漏。为什么它没有检测到静态存储持续时间对象的泄漏?我在这里遗漏了什么吗?

【问题讨论】:

  • 我很好奇你是否见过 valgrind 在main() 开始之前报告任何这样的内存泄漏,而不仅仅是这个例子?我不知道它什么时候开始监控,但main() 似乎是一个合适的地方来下钩。
  • @WhozCraig 实际上我刚开始使用 valgrind(OS X,之前使用过 Instruments,因为 Yosemite 没有版本),只是在玩。
  • 好嫉妒。我仍然没有在优胜美地上运行我的。我不认为你写了一篇关于设置它的博客 =P ? (一厢情愿,我知道)。
  • @WhozCraig 只需使用 macports 并通过 sudo port install valgrind-devel 安装 valgrind-devel ;) 很简单。非开发版仍然不兼容,但开发版可以工作。
  • 嘿。 谢谢你。在 MacPorts、xcode-select 和 valgrind-devel(因此是 automake、libtool 等)之间,我的 av-autoscan 刚刚得到了很好的锻炼。但它已安装并且看起来不错。再次感谢。

标签: c++ memory-leaks valgrind


【解决方案1】:

它们仍然可以访问,因此不会被视为泄露。如果您想显示甚至可以到达的块,请将--leak-check=full --show-leak-kinds=all 传递给 valgrind。

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

【讨论】:

  • 必须记下那个。谢谢。