vs下C++内存泄露检测

参考文章:

http://msdn.microsoft.com/zh-cn/library/x98tx3cf.aspx

1、在main方法所在的文件里加上如下代码:

//可以定位到发生内存泄露 所在的文件和具体那一行,用于检测 malloc 分配的内存
 2 #define _CRTDBG_MAP_ALLOC 
 3 #include <stdlib.h>
 4 #include <crtdbg.h>
 5 
 6 //把分配内存的信息保存下来,可以定位到那一行发生了内存泄露。用于检测 new 分配的内存
 7 #ifdef _DEBUG
 8 #define new   new(_NORMAL_BLOCK, __FILE__, __LINE__)
 9 #endif
10 
11 //有用
12 inline void EnableMemLeakCheck()
13 {
14     //该语句在程序退出时自动调用 _CrtDumpMemoryLeaks(),用于多个退出出口的情况.
15     //如果只有一个退出位置,可以在程序退出之前调用 _CrtDumpMemoryLeaks()
16    _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
17 }
复制代码

 

2、在main方法里开始的地方调用 EnableMemLeakCheck() 方法。到此为止,可以检测的内存泄露的信息里,有一部分是可以定位到具体的文件以及所在的行的,但还是有一些其他工程或者其他文件里如果发生内存泄露还是没有定位到具体的文件和行,这些信息会在vs的输出窗口里看到。如下面的输出,第一处泄露有很具体的定位信息,第二处的泄露却没有。

1 q:\project_wydxml\wydxmlcreator\project_win32\wydxmlcreator.cpp(52) : {256} normal block at 0x00ABBC40, 200 bytes long.
2  Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
3 {254} normal block at 0x00ABF6F8, 10 bytes long.
4  Data: <          > CD CD CD CD CD CD CD CD CD CD 

 

3、对于那些没有定位出具体位置的内存泄露处理如下:记录下该处内存是第几次分配的,比如上面的第三行和第四行表示第二处内存泄露,第三行里 {}里的254表示该处泄露的内存是第 254 次分配的。结束运行,在 EnableMemLeakCheck() 方法 后加上一句代码: _CrtSetBreakAlloc(254); 括号里的参数就是没有得到准确定位的泄露内存的被分配的序数,其他的就别改了,再次运行,程序就会在 分配 第 254 块 内存时进入断点,通过断点堆栈就可以比较方便的知道哪些泄露了。

 

4、注意事项:对于 new 出来的一些自定义类的对象,直接调用其析构方法时,EnableMemLeakCheck 还是会将其视作没有释放内存的,要直接调用 delete xxx 才行。。。如: A *a = new A();  a->~A(); 会被判做有问题的, delete a 才视作没问题。。。。

 

5、令外,还有个监控某片代码段是否有内存泄露的,如下。如果有这段代码有泄露,_CrtMemDifference就会比较出来,然后 _CrtMemDumpStatistics输出相关信息。输出的信息没有具体的定位到具体文件具体哪一行,但有时还是有些辅助作用的吧

复制代码
1 _CrtMemState s1, s2, s3;
2 _CrtMemCheckpoint( &s1 );
3 
4 //your code
5 
6 CrtMemCheckpoint( &s2 );
7 if ( _CrtMemDifference( &s3, &s1, &s2) )
8      _CrtMemDumpStatistics( &s3 );
复制代码

 

 

 

全部代码如下:

复制代码
 1 #include "stdafx.h"
 2 #include <iostream>
 3 #include "wydxml.h"
 4 
 5 //可以定位到发生内存泄露 所在的文件和具体那一行,用于检测 malloc 分配的内存
 6 #define _CRTDBG_MAP_ALLOC 
 7 #include <stdlib.h>
 8 #include <crtdbg.h>
 9 
10 //把分配内存的信息保存下来,可以定位到那一行发生了内存泄露。用于检测 new 分配的内存
11 #ifdef _DEBUG
12 #define new   new(_NORMAL_BLOCK, __FILE__, __LINE__)
13 #endif
14 
15 //有用
16 inline void EnableMemLeakCheck()
17 {
18     //该语句在程序退出时自动调用 _CrtDumpMemoryLeaks(),用于多个退出出口的情况.
19     //如果只有一个退出位置,可以在程序退出之前调用 _CrtDumpMemoryLeaks()
20    _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
21 }
22 
23 
24 int _tmain(int argc, _TCHAR* argv[])
25 {
26     
27     EnableMemLeakCheck();
28 
29     //运行到 第 191 次 内存分配的时候停下来
30     //_CrtSetBreakAlloc(191);
31 
32     char* p = new char[100];
33     char* p1 = new char[200];
34     char* p2 = (char*)malloc(600);
35     delete p;
36 
37     getchar();
38 
39     //_CrtDumpMemoryLeaks();//这个代码好像会输出额外多余的内存分配信息
40     return 0;
41 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Visual Leak Detector是一款免费的、健全的、开源的Visual C++内存泄露检测系统。相比Visual C++自带的内存检测机制,Visual Leak Detector可以显示导致内存泄露的完整内存分配调用堆栈。 下载Visual Leak Detector,当前版本2.2.3,在Visual C++ IDE的"工具"→"选项"→"项目和解决方案"→"VC++ 目录","包含文件"增加VLD的"\include"路径,"库文件"增加VLD的"\lib\Win32"路径,另外动态库"\bin\Win32"路径在安装时已经添加到环境变量里面了,若是未添加,则需要手动拷贝"\bin\Win32"下的文件到工程Debug目录。下 展开查看详细 收起信息 返回顶部 1.新建一个Win32控制台项目; 2.添加代码如下所示: #include "stdafx.h" #include "vld.h" int _tmain(int argc, _TCHAR* argv[]) { char *pBuf = new char[200]; return 0; } 3.在Debug模式下的“输出”窗口,将有如下信息: 报告列出了内存泄露是在第几块,所在的地址,泄露的字节,调用的堆栈,内存内容。双击调用堆栈可以跳转到所在行。 4.在Release模式下,不会链接Visual Leak Detector。 5.Visual Leak Detector有一些配置项,可以设置内存泄露报告的保存地(文件、调试器),拷贝"\Visual Leak Detector"路径下的vld.ini文件到工程的Debug目录下(在IDE运行的话,则需要拷贝到工程目录下),修改以下项: ReportFile = .\memory_leak_report.txt ReportTo = both 直接双击Debug目录下exe,文件内容跟“输出”窗口的内容一样。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值