使用CRT库进行内存泄漏检测

使用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,可以给自己带来很大帮助,有时间大家多瞧瞧)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值