vs下C++内存泄露检测

参考文章:

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

http://www.cnblogs.com/jianqiang2010/archive/2010/12/02/1894327.html

http://www.cnblogs.com/skynet/archive/2011/02/20/1959162.html

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

 1 //可以定位到发生内存泄露 所在的文件和具体那一行,用于检测 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 }

本文原链接: http://www.cnblogs.com/zouzf/p/4152279.html

时间: 2024-10-08 10:03:45

vs下C++内存泄露检测的相关文章

Linux下C++内存泄露检测工具

下载安装:http://blog.csdn.net/wanglin754/article/details/7194145 下载地址:http://www.valgrind.org/downloads/current.html#current 安装valgrind tar jxvf valgrind-3.7.0.tar.bz2             注意这里的参数里加了j,表示有bz2属性 cd valgrind-3.7.0 ./configure make make install make

Android 源码系列之&lt;十四&gt;从源码的角度深入理解LeakCanary的内存泄露检测机制(下)

转载请注明出处:http://blog.csdn.net/llew2011/article/details/52958567 在上边文章Android 源码系列之<十三>从源码的角度深入理解LeakCanary的内存泄露检测机制(中)由于篇幅原因仅仅向小伙伴们讲述了在Android开发中如何使用LeakCanary来检测应用中出现的内存泄露,并简单的介绍了LeakCanary的相关配置信息.根据上篇文章的介绍我们知道LeakCanary为了不给APP进程造成影响所以新开启了一个进程,在新开启的

C/C++内存泄露检测

gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4Copyright (C) 2013 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 一.mtrace 1.介绍

Visual C++内存泄露检测—VLD工具使用说明 .

1.VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的特点有:可以得到内存泄漏点的调用堆栈,如果可以的话,还可以得到其所在文件及行号: 可以得到泄露内存的完整数据: 可以设置内存泄露报告的级别:并且是开源免费的. 2.VLD下载 http://www.codeproject.com/tools/visualleakdetector.asp 本文后附有vld1.0的工具包,下载解包后就可使用. 3.VLD安装 方法一: 解

内存泄露检测工具——LeakCanary

很简单:我们不是创建服务不是为了赚钱:我们赚钱是为了提供更好的服务.我们认为这才是做事的态度. 学习使用Java的同学都应该知道,Java的JVM给我们提供的垃圾回收机制是极为好用的.但是我们也很清楚,垃圾回收机制不是万能的,使用不当很容易造成内存泄露.之前我们也介绍过Java中常用的内存泄露检测工具MAT,目前Java程序最常用的内存分析工具应该是MAT(Memory Analyzer Tool),它是一个Eclipse插件,同时也有单独的RCP客户端. 不熟悉MAT的同学,或者对Java垃圾

vld,Bounds Checker,memwatch,mtrace,valgrind,debug_new几种内存泄露检测工具的比较

概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,这时就出现了内存泄漏.尽管优秀的编程实践可以确保最少的泄漏,但是根据经验,当使用大量的函数对相同的内存块进行处理时,很可能会出现内存泄漏. 内存泄露可以分为以下几类:1. 常发性内存泄漏.发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏.2. 偶发性内存泄漏.发生

vld(Visual Leak Detector) 内存泄露检测工具

初识Visual Leak Detector 灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题.当程序越来越复 杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题.内存泄漏是最常见的内存问题之一.内存泄漏如果不是很严重,在短时间内对程序不会有太大的 影响,这也使得内存泄漏问题有很强的隐蔽性,不容易被发现.然而不管内存泄漏多么轻微,当程序长时间运行时,其破坏力是惊人的,从性能下降到内存耗尽,甚 至会影响到其他程序的正常运行.另外内存问题的一个共同特点是,内存问题本身

memwatch内存泄露检测工具

工具介绍 官网 http://www.linkdata.se/sourcecode/memwatch/ 其功能如下官网介绍,挑选重点整理: 1. 号称功能: 内存泄露检测 (检测未释放内存, 即 动态内存开辟未释放的情况) 2. 检测 多次调用free, 和 free 错误地址 3. 检测内存访问的 上越界 和 下越界 4. 检测对野指针进行的写操作 其他内存检测工具有 mtrace valgrind 参考 http://www.cnblogs.com/honglihua8688/p/37279

c++内存泄露检测与定义

对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题.已经有许多技术被研究出来以应对这个问题,比如 Smart Pointer,Garbage Collection等.Smart Pointer技术比较成熟,STL中已经包含支持Smart Pointer的class,但是它的使用似乎并不广泛,而且它也不能解决所有的问题:Garbage Collection技术在Java中已经比较成熟,但是在c/c++领域的发展并不顺畅,虽然很早就有人思考在C++中也加入GC的支持.现实世界就是这