您的位置:首页 > 其它

快速定位内存泄漏的位置

2010-03-23 15:48 525 查看
每次分配内存系统都会分配一个内存序列标志,通过_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入口函数的开始处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: