快速定位内存泄漏的位置
每次分配内存系统都会分配一个内存序列标志,通过_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入口函数的开始处。