原创 智能找出内存泄漏收藏

新一篇: 文件属性克隆器 | 旧一篇: VBScript 数据类型-Variant

对于一个c/C++的程序员来说,内存泄漏也是令大家常常头疼的问题,往往内存泄漏会造成软件的致命Bug,显示的泄漏还有隐示的泄漏,堆内存的泄漏,还有系统资源的泄漏。从目前看来已有一些技术能够解决这些问题,Smart pointer(智能指针)Garbage Collection(垃圾回收机制),虽然SP技术再STL中已经相当的成熟,但是还是使用不很广泛,虽然GC在Java中已经很成熟,但是在我们c++这个领域发展依然不容乐观,那么我们如何在实际开发中去发现这些泄漏呢?一般情况下我们所说的内存泄漏都是指堆内存泄漏,往往程序员在使用malloc new realloc函数在堆上分配一块内存,用完之后就要调用free delete函数进行内存的释放,如果没有去释放这块内存,那么就造成了所说的内存泄漏。内存泄漏不光光指的是堆内存泄漏,其实还有系统资源的内存泄漏,虽然他们是由系统分配的对象,但是他们同样占用着内存,甚至某些资源消耗的是核心态内存,那么这样往往会对系统造成不稳定。我们检测内存泄漏的关键就是要能截获对分配内存和释放内存的函数的调用 ,如果能截获住这些函数,那么我们就能够去跟踪这些内存区域的生命周期。我们要检测内存泄漏,那么就必须去捕获malloc realloc free new delete 这几个函数 ,那么我们可以使用什么方式来截获呢,其实除了使用工具外,我们今天要说的就是如何使用debug模式下的内存检测代码,一般情况下在MFC工程中,都会自动的加入这些内存检测代码,而我们如何在非MFC工程中同样也去使用这些看似智能的代码呢

       其实我们只需要在程序入口函数中写入这段代码,并且要包含<crtdbg.h>头文件就可以了
      
    
    
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ); 
    tmpFlag 
|= _CRTDBG_LEAK_CHECK_DF; 
    _CrtSetDbgFlag( tmpFlag );
下面是个完整的例子?我们在使用malloc分配了100字节的内存空间,然而我们在使用完后并没有使用free去释放它,那么就造成了显示的内存泄漏.
#include <windows.h>
#include 
<iostream.h>
#include 
<crtdbg.h>
#include 
<malloc.h>
#include 
<string.h>

class myString
{
public:
    myString();

    
~myString();

private:
    
int nCount;
    
char *pszbuffer;

}
;

myString::myString()
{
    
this->nCount = 0;

    
this->pszbuffer = NULL;

    cout
<<"This is conStruction Function..."<<endl;
}


myString::
~myString()
{
    cout
<<"This is Destory Function...."<<endl;
}


int main(void)
{
    
    
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ); 
    tmpFlag 
|= _CRTDBG_LEAK_CHECK_DF; 
    _CrtSetDbgFlag( tmpFlag );

    myString my;

    
char *newString = (char*)malloc(sizeof(char* 100);

    strcpy(newString,
"I come from china...");

    cout
<<newString<<endl;

   //free(newString);

    
return 0;
}



















这是在Debug窗口中显示的内存泄漏信息
Dumping objects ->
{43} normal block at 0x00370B40, 100 bytes long.
 Data: <I come from chin> 49 20 63 6F 6D 65 20 66 72 6F 6D 20 63 68 69 6E
很清楚告诉了我们在那个地址处发生了内存泄漏,那么这样我们就可以通过这些信息去找出我们程序中存在的内存泄漏。

发表于 @ 2007年12月21日 13:09:00|评论(loading...)|编辑

新一篇: 文件属性克隆器 | 旧一篇: VBScript 数据类型-Variant

评论

#baguijin999 发表于2007-12-21 16:36:01  IP: 218.24.136.*
这种方式输出的是申请内存和释放内存不配对的情况,如果现在需要一个全局的链表,往链表上加数据的时候需要申请内存,但是不需要释放内存,释放的动作放在另外的地方,(比如程序退出时),照样会有文章所说的输出。
#sunraiing9 发表于2007-12-21 16:48:07  IP: 218.80.116.*
哈哈 受用,不过要是能报出类型信息就好咯

这样还要填充该段内存 不知道怎么利用哈 呵呵
#wjk98550328 发表于2007-12-21 17:43:35  IP: 61.144.246.*
好智能啊。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
#mcsezhy 发表于2007-12-21 20:33:22  IP: 121.106.58.*
用int _CrtDumpMemoryLeaks( void );也不错呀。。。
#agaric 发表于2007-12-21 22:22:12  IP: 222.90.92.*
除了內存,還有很多資源都會存在洩漏的問題
#hardmy 发表于2007-12-22 20:37:41  IP: 125.37.221.*
确实这样的
#mrTony 发表于2007-12-23 17:54:33  IP: 125.33.199.*
1. _CrtDumpMemoryLeaks( void )好象存在一些问题,如果资源在调用_CrtDumpMemoryLeaks( void )之后释放(全局变量或者静态变量),本来没有内存泄露,而错误地报告了内存泄露.
2.已经有很多人写出了一些功能完备的内存泄露检测模块,比较有名的mmgr,可以打印出来代码中具体的泄露位置,很方便,你google一下应该找得到.如果找不到,跟我联系.
#dizuo 发表于2007-12-23 19:52:30  IP: 60.176.46.*
vc2005下面运行没有什么反映啊;
^_^
发表评论  


登录
Csdn Blog version 3.1a
Copyright © M.A.O