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时我遇到错误.
您确定泄漏的代码正在使用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.
如果您正在使用预编译的头文件,则可以将其放在预编译的头文件中,它将影响该项目中的所有源文件.