使用VC自带的检测工具进行内存泄漏检测的一个前提:要进行泄漏检测的解决方案中没有对new和delete进行重载。
PS:我最开始使用这个时,没有注意到这点,因为项目一个依赖的工程中对new进行了重载,导致我每次测试都不能成功,浪费了小半天时间。
开启内存泄漏检测功能,在工程的中包含以下
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
如果你的工程中会使用到new操作符,请将以下也包含在工程中
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif // _DEBUG
1._CrtDumpMemoryLeaks();
将_CrtDumpMemoryLeaks();添加到程序退出之前的任意位置,即可在执行完输出内存泄漏的报告。
2._CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
如果你的应用程序有多个出口,你不必手动在每个出口位置添加_CrtDumpMemoryLeaks();,只需在程序开始时调用_CrtSetDbgFlag,程序会自动在每个出口位置调用_CrtDumpMemoryLeaks.
3._CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
如果你使用的某个库会将输出转移到另一个地方,可以使用_CrtSetReportMode将输出重新定位到Output窗口。
分析一下输出结果:
如果没有定义_CRTDBG_MAP_ALLOC,输出会是如下格式:
Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
如果定义了_CRTDBG_MAP_ALLOC,输出会是如下格式:
Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
以上两种输出报告的区别在于,第二种报告输出了有泄漏的文件的名字和泄漏产生的行号。
1. 18是内存分配的顺序号
2. 内存块类型,在这个例子中是normal
3. 16进制的内存位置,在这个例子中是0x00780E80
4. 块的大小,在这个例子中是64bytes
5. 该块中前16个字节的数据是16进制格式。
如果想在测试时出现泄漏的位置设置断点,在这个例子中是第18个分配的内存块出现泄漏,即可使用下面两种设置方法
_crtBreakAlloc = 18;或_CrtSetBreakAlloc(18);
以上均翻译自http://msdn.microsoft.com/en-us/library/vstudio/x98tx3cf.aspx,鄙人能力有限,可能表述存在瑕疵,更详细介绍请参考msdn(如果能熟练使用msdn,可以给自己带来很大帮助,有时间大家多瞧瞧)