1. 开启CRT
在程序入口C/CPP文件增加如下头文件, 注意宏 _CRTDBG_MAP_ALLOC 要放在前面
#define _CRTDBG_MAP_ALLOC
#include<stdlib.h>
#include<crtdbg.h>
在程序结束前调用
_CrtDumpMemoryLeaks()
这样程序结束时就会在调试输出窗口得到内存泄漏信息。 如下图。 你点击就会定位到相应的源文件,但不是所有的都行
2. MFC 里的CRT
MFC里默认已经增加了, 请google 查询
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
3. 定位泄漏点
a. 如果泄漏是你直接造成的, 那么你直接点击报告行就会自动定位。
b. 如果是外面DLL造成的(也许是你写的,src也在项目里,但CRT不认). 那你得通过下条件断点观察callstack来定位:
参考: How to Find the Source of Memory Leaks
详细方法为:
i'. 随便找个要申请内存的地方,单步跳进去, 到到找到如下几行:
在这里下断点
ii'. 找到你要查找的申请编号(Allocate Number) (如下图红框内数字), 然后将上面的断点改成条件断点,条件为: lRequest==申请编号
ii'. 运行你的程序, 爽, 出来了!