2

我想使用 _CRTDBG_MAP_ALLOC 获取内存泄漏信息,尤其是文件和行号,但最后我没有得到它们。我只得到这样的东西:

{130} 0x00695128 处的普通块,16 字节长。数据:<\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?)的某个地方。但是如何知道这些内存泄漏是从哪里来的呢?

4

3 回答 3

4

通常 _CRTDBG_MAP_ALLOC 不会帮助您处理第 3 方代码。_CRTDBG_MAP_ALLOC 将正常的内存分配函数(即 malloc)重定向到在编译时获取文件和行号(即 _malloc___dbg)的特殊调试版本。如果第 3 方代码不是使用定义的 _CRTDBG_MAP_ALLOC 构建的,那么您将看不到该信息。此外,这对非 CRT 内存分配函数(即 HeapAlloc、GlobalAlloc、LocalAlloc、VirtualAlloc 等)没有帮助,尽管 boost 几乎可以肯定使用 CRT 函数。

如果分配编号一致,您可以在分配发生时使用 _CrtSetBreakAlloc 设置断点,以查看分配内存的代码。另外,请记住,如果您在程序结束时调用 _CrtDumpMemoryLeaks,那么任何全局对象都还没有被破坏,它们的内存将显示在输出中。

于 2009-09-27T03:18:39.350 回答
2

尝试使用 _CrtSetAllocHook 在每次堆分配之前注册回调函数。可以在此处找到使用它来突出显示泄漏的分配行的 GUI 应用程序: Visual Leak Detector

于 2009-09-27T02:54:18.670 回答
0

我认为\ _CRTDBG_MAP_ALLOC 应该与boost 中的仅标头库(例如shared_ptr)一起使用,因为它们在标头中实现。我非常怀疑你会在 shared_ptr 中发现任何内存泄漏。我什至怀疑 shared_ptr 甚至调用分配堆内存。请记住,这是经过良好测试的代码,很可能是您导致了泄漏。

由于没有很好的迹象表明泄漏发生在哪里,我猜它是由第三方库中的内存分配引起的,并且库希望您进行清理。

于 2009-09-27T15:30:23.447 回答