您的位置:首页 > 编程语言 > C语言/C++

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

2013-11-04 15:53 218 查看
使用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,可以给自己带来很大帮助,有时间大家多瞧瞧)

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息