Valgrind 检测到堆分配错误?

Valgrind detected wrong allocation on heap?

我写了一个 C++ 程序,运行 在 valgrind 上正确,但我注意到一些东西真的 st运行ge:

==23369== HEAP SUMMARY:
==23369==     in use at exit: 0 bytes in 0 blocks
==23369==   total heap usage: 1 allocs, 1 frees, 72,704 bytes allocated

这个分配是从哪里来的? 我只调用了 sbrk()mmap() 但从未使用过 mallocnew 那么我怎么知道是什么原因造成的?


更新: 我删除了 #include <iostream> 并且成功了!我还是不明白这是为什么。我刚刚包含了一个我没有使用的库...(我有 cassert 和删除 #include <iostream> 没有问题

您可以尝试调试您的程序(我们需要先安装 libstdc++ 的调试符号,参见 this):

  1. 用gdb启动程序
gdb $YOUR_PROGRAM
  1. 添加调试断点
b malloc
  1. 运行 程序
r
  1. 获取断点后的调用轨迹:
bt

在我的电脑上有这个几乎是空的程序:

#include <iostream>
int main(int argc, char* argv[]) { return 0; }

我们只得到一次调用轨迹(和OP一样,大小72,704完全一样!):

#0  __GI___libc_malloc (bytes=bytes@entry=72704) at malloc.c:3043
#1  0x00007ffff7e2eb8a in (anonymous namespace)::pool::pool (
    this=0x7ffff7fc3b40 <(anonymous namespace)::emergency_pool>)
    at ../../../../src/libstdc++-v3/libsupc++/eh_alloc.cc:123
#2  __static_initialization_and_destruction_0 (__priority=65535, __initialize_p=1)
    at ../../../../src/libstdc++-v3/libsupc++/eh_alloc.cc:262
#3  _GLOBAL__sub_I_eh_alloc.cc(void) ()
    at ../../../../src/libstdc++-v3/libsupc++/eh_alloc.cc:338
#4  0x00007ffff7fdfdbe in ?? () from /lib64/ld-linux-x86-64.so.2
#5  0x00007ffff7fdfea8 in ?? () from /lib64/ld-linux-x86-64.so.2
#6  0x00007ffff7fcf10a in ?? () from /lib64/ld-linux-x86-64.so.2

如果我们去掉#include <iostream>,我们就不会再打malloc了! 现在我们确认malloc是由libstdc++(STL)库本身调用的。

STL中有一个全局对象emergency_pool,在析构到reserve memory时会调用malloc,如果我们包含iostream,它会在[=之前构造21=].