我想使用 _CRTDBG_MAP_ALLOC 获取内存泄漏信息,尤其是文件和行号,但最后我没有得到它们。我只得到这样的东西:
{130} normal block at 0x00695128, 16 bytes long. Data: <\ E Pi > 5C A5 45 01 02 00 00 00 01 00 00 00 E8 50 69 00
我发现这应该位于所有包含之前:
#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
有些人建议在所有源文件中的所有包含之后添加此内容:
#ifdef _DEBUG
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif
但是,在 main.cpp 中,如果我显式添加内存泄漏,它会在输出中与行号一起出现!所以它有效,但并不适用于所有情况......
当我使用 Boost 库时,我怀疑内存泄漏都发生在这些......(shared_ptr?)。但如何知道这些内存泄漏从何而来呢?
最佳答案
通常 _CRTDBG_MAP_ALLOC 不会帮助您使用第 3 方代码。 _CRTDBG_MAP_ALLOC 将正常内存分配函数(即 malloc)重定向到特殊的调试版本,该版本在编译时获取文件和行号(即 _malloc___dbg)。如果第 3 方代码不是使用定义的 _CRTDBG_MAP_ALLOC 构建的,那么您将看不到该信息。此外,这对您使用非 CRT 内存分配函数(即 HeapAlloc、GlobalAlloc、LocalAlloc、VirtualAlloc 等)没有帮助,尽管 boost 几乎肯定会使用 CRT 函数。
如果分配编号一致,您可以使用 _CrtSetBreakAlloc 在分配发生时设置断点,以查看哪些代码正在分配内存。另外,请记住,如果您在程序末尾调用 _CrtDumpMemoryLeaks,则任何全局对象尚未被破坏,它们的内存将显示在输出中。
关于c++ - 使用 Boost 时的内存泄漏检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1482575/