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()
但从未使用过 malloc
或 new
那么我怎么知道是什么原因造成的?
更新: 我删除了 #include <iostream>
并且成功了!我还是不明白这是为什么。我刚刚包含了一个我没有使用的库...(我有 cassert 和删除 #include <iostream>
没有问题
您可以尝试调试您的程序(我们需要先安装 libstdc++ 的调试符号,参见 this):
- 用gdb启动程序
gdb $YOUR_PROGRAM
- 添加调试断点
b malloc
- 运行 程序
r
- 获取断点后的调用轨迹:
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=].
我写了一个 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()
但从未使用过 malloc
或 new
那么我怎么知道是什么原因造成的?
更新: 我删除了 #include <iostream>
并且成功了!我还是不明白这是为什么。我刚刚包含了一个我没有使用的库...(我有 cassert 和删除 #include <iostream>
没有问题
您可以尝试调试您的程序(我们需要先安装 libstdc++ 的调试符号,参见 this):
- 用gdb启动程序
gdb $YOUR_PROGRAM
- 添加调试断点
b malloc
- 运行 程序
r
- 获取断点后的调用轨迹:
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=].