关于MFC下检查和消除内存泄露的技巧
2007-03-17 21:24:48 来源:WEB开发网核心提示: Detected memory leaks!Dumping objects ->C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20) : {18} normal block at 0x00780E80, 64 b
Detected memory leaks!
Dumping objects ->
C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20)
就是源文件名称和行号。
第二种比较麻烦,就是不能映射到源文件的,只有内存分配块号。
Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
这种情况我采用一种"试探法"。由于内存分配的块号不是固定不变的,而是每次运行都是变化的,所以跟踪起来很麻烦。但是我发现虽然内存分配的块号是变化的,但是变化的块号却总是那几个,也就是说多运行几次,内存分配的块号很可能会重复。因此这就是"试探法"的基础。
先在调试状态下运行几次程序,观察内存分配的块号是哪几个值;
选择出现次数最多的块号来设断点,在代码中设置内存分配断点: 添加如下一行(对于第 18 个内存分配):_crtBreakAlloc = 18;
或者,可以使用具有同样效果的 _CrtSetBreakAlloc 函数:_CrtSetBreakAlloc(18);
在调试状态下运行序,在断点停下时,打开"调用堆栈"窗口,找到对应的源代码处;
退出程序,观察"输出窗口"的内存泄露报告,看实际内存分配的块号是不是和预设值相同,如果相同,就找到了;如果不同,就重复步骤3,直到相同。
最后就是根据具体情况,在适当的位置释放所分配的内存。
更多精彩
赞助商链接