快速定位内存泄漏的位置

每次分配内存系统都会分配一个内存序列标志,通过_CrtIsMemoryBlock函数可以获取这个序列标志值以及分配的文件名和行号位置:

        int* pNum = (int*)_malloc_dbg(12, _NORMAL_BLOCK, __FILE__, __LINE__);

         ...

         ...

         ...

        long lReg = 0;

        char szFile[MAX_PATH];

        PSTR pszFile = szFile;

        int nLine = 0;

        _CrtIsMemoryBlock (pNum, 12, &lReg, &pszFile, &nLine);

 

MFC程序中出现内存泄漏时,程序结束会输出内存泄漏信息,如:

Detected memory leaks!

Dumping objects ->

{56} normal block at 0x003F69D8, 12 bytes long.

 Data: <            > CD CD CD CD CD CD CD CD CD CD CD CD

Object dump complete.

其中56就是泄漏的内存的序列标志值,在Debug模式下可以利用_CrtSetBreakAlloc函数使程序运行到分配该内存的位置时中断,以便查找确切的泄漏位置,如:

_CrtSetBreakAlloc(56);

这样程序运行到分配该位置的内存时就会发生中断,通过调用堆栈可以查看泄漏的代码位置。

_CrtSetBreakAlloc函数的调用位置需在分配内存之前,如果不知道分配内存在哪里,那就放到程序运行的开始处,如_tWinMain入口函数的开始处。

posted @ 2010-03-23 15:48  孤竹君  阅读(4706)  评论(0编辑  收藏  举报