window 下内存泄漏检测

 在window 下开发进行内存泄漏的检测相对比较容易。 这里只是简单的记录一些东西,没有具体的谈论实现。 window 下面内存检测主要可以考虑从两个方面入手,这两个方面并不是一个if else 分支。
   1、如果你在MS 的开发环境下,(其他的开发环境不是很熟悉),可以使用MS 内部定义的调试库,使用他们是比较简单的,下面就简单的写一个例子:
    #include  <crtdbg.h>
    int main() { char *pString = new char[8] ; _CrtDumpMemoryLeaks(); return 0; }
    通过上面的例子,就就知道了如何使用这些调试库,首先是保护这个调试库的头文件,具体调试库提供了那些api,可以到.h文件中看看, Dump Meory Lead 只是其中的一个而已。要注意的事情是这些函数只能使用在debug 版本的程序中。 另外一个比较实用的例子就是通过设置内存状态检测点来比较内存的变化,从而排查出内存泄漏的地方。 涉及到的三个api 函数是: 设置内存状态检测点:_CrtMemCheckPoint(&memstate);  比较内存状态检测点之间的差异:_CrtMemDifference (&memstate_difference , & memstate_original, & memstate_now ) ; 显示内存状态的差异:_CrtDumpAllObjectsSince(&memstate_defference);  具体使用可以看看msdn 。

   2、另外实现的方法就是自己重载new、delete、malloc、free 等内存分配和释放的函数,通过设置一个list 来记录内存分保的情况。 可以通过这样的框架来实现这个公共: A 、#define new  DEBUG_NEW
          B、#define DEBUG_NEW(nSize) NewFunc((nSize),THIS_FILE, __LINE__)  //或者通过重载new 的方法来实现
         C、void * NewFunc(size_t  size , const char *pFileName , int nLine)
               {
                            // Lock list
                            //Allocate memory
                            //Add the memroy object to the list 
                            //Unlock list
                            return memory ;
              }
        D 、Free 的实现类似。
        这样的话,在程序推出的时候,就可以dump 出说有分配了但是没有释放的内存。 多数自己实现防止内存泄漏的方法都是这样的。

       MS 在MFC 还提供了一个类 CMemoryState 和一些API , AfxCheckMemory,AfxDumpMemoryLeaks .... 都是很方法的方法。

         MS 推荐的检测内存泄漏的方法的是这样的:
       1、跟踪内存分配的情况,使用DEBUG_NEW 来代替new 完成内存分保的操作, 在很多MFC 的项目中,在.cpp 文件中可以看到很多 define new DEBUG_NEW ,就是为了这个目的。
       2、允许内存诊断,可以通过 AfxEnableMemoryTracking 函数来设置允许内存诊断,如果不使用MFC 的项目中,可以直接通过函数 _CrtSetDbgFlag 来设置 _CRTDBG_ALLOC_MEM_DF 标识。具体可以看看这个函数的source code。 设置之后你就可以使用 AfxCheckMemory 之内的api 来进行内存检测了。 其实这个函数也是直接调用了_CrtCheckMemory 函数,这样在不是MFC 的环境,就可以直接调用 _CrtCheckMemory 函数。
      3、对内存做快照,通过比较内存快照的变化来找出内存泄漏的地方。这个就是上面说的方法。
      4、查考内存的统计数据,可以通过CMemoryState::DumpStatistics 来完成,具体可以看看CmemoryState 这个类的用法。
      5、Object Dump ,这个是通过 CMeoryState ::DumpAllObjectsSince
 来完成对象的dump 。

posted on 2006-09-27 01:19  cy163  阅读(...)  评论(...编辑  收藏

导航