Visual Studio 2008(C++)内存泄漏检测未显示文件/方法位置 - 如何使其工作?

Tim*_*Tim 8 c++ memory-leaks visual-studio-2008

我正在使用此处说明尝试在Win32应用程序中查找内存泄漏.如上所述,我把它

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
Run Code Online (Sandbox Code Playgroud)

文件顶部的行(包含WINAPI _tWinMain的cpp文件)然后在winmain的退出点添加

_CrtDumpMemoryLeaks();
Run Code Online (Sandbox Code Playgroud)

不幸的是,我没有看到泄漏的行号/位置(但我确实得到了泄漏列表).

我也尝试过

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
_CrtSetReportMode ( _CRT_ERROR, _CRTDBG_MODE_DEBUG); 
Run Code Online (Sandbox Code Playgroud)

在winmain的开头 - 再次,没有运气.

我发现这很奇怪,因为我通常没有发现任何泄漏或自动报告的问题.

这是我正在为新雇主工作的一个巨大的旧版应用程序.在过去,我使用过标准的VS向导.

有关如何获取导致泄漏的源代码行/方法的任何建议?(或者至少是"新"电话的线路?

编辑:

我也试过视觉检漏仪 - 没有成功.

很奇怪.

编辑

我尝试使用下面列出的new的重新定义,但是在编译boost时我遇到错误.

Tim*_*ter 6

您确定泄漏的代码正在使用CRT调试分配例程吗?这需要使用malloc()new(而不是LocalAlloc,GlobalAlloc,一些自定义块分配器,等等.)和_DEBUG(我认为)时被包括在CRT头必须被定义.

为了获取泄漏的源代码行,您需要定义DEBUG_NEW分配发生的每个位置.这是因为为了跟踪它们,必须用包含__FILE__和的调用替换每个分配__LINE__.向导中的标准定义如下所示:

#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif
Run Code Online (Sandbox Code Playgroud)

malloc如果您正在调试的代码使用malloc而不是,那么可能没有处理,可能有类似的咒语new.

如果您正在使用预编译的头文件,则可以将其放在预编译的头文件中,它将影响该项目中的所有源文件.

  • 我也遇到过这种情况.一些boost库覆盖了`operator new`,所以你必须在*包括boost头之后执行`DEBUG_NEW`定义*,或者至少包含其中一些. (6认同)