智能找出内存泄漏 (转至inventworm)

来源:互联网 发布:2018高考倒计时软件 编辑:程序博客网 时间:2024/04/30 23:49
对于一个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
很清楚告诉了我们在那个地址处发生了内存泄漏,那么这样我们就可以通过这些信息去找出我们程序中存在的内存泄漏。