我的环境是: XP SP2 . VS2003
最近在一个项目中,程序退出后都出现内存泄漏:
Detected memory leaks!
Dumping objects ->
{73} normal block at 0x009C2680, 292 bytes long.
Data: <c:/test2.ts > 63 3A 5C 74 65 73 74 32 2E 74 73 00 CD CD CD CD
{71} normal block at 0x009C2520, 292 bytes long.
Data: <d:/test1.ts > 64 3A 5C 74 65 73 74 31 2E 74 73 00 CD CD CD CD
Object dump complete.
The program '[952] test.exe: Native' has exited with code 0 (0x0).
而且每次退出都是一样的.泄漏的内存块都是73 和 71.
解决方法:
1. 在程序开始启动的地方(足够前的地方,只要在泄漏的内存分配的前面)使用代码:
_CrtSetBreakAlloc(73); //73为上面内存泄漏的块号.
2. 然后debug运行,程序自动断点在"内存块73"分配的位置:
/* break into debugger at specific memory allocation */
if (_crtBreakAlloc != -1L && lRequest == _crtBreakAlloc)
_CrtDbgBreak();
3 .我们已经找到了泄漏的那块内存分配的底层操作的地方了(好拗口!).
这个时候我们利用 "调试" –> "退出" ,快捷键为:"Shift + F11" .
跳出当前函数..然后一直往"上"跳,边跳边查看调用栈.直到看到了自己写的代码,例如我的
MaterialInfo* pmi = new MaterialInfo();
4 .这个时候我已经可以判断 pmi 分配了内存,但是没有合理释放.处理后再次运行就没有出现内存泄漏了.
5.最后,记得把_CrtSetBreakAlloc(98500); 这句话删除掉,不然每次都断点,岂不是烦死..
----------------------------------------------------------------------------------------------------------
写在后面:
关于内存泄漏检测,有一个Visual Leak Detector ,按照它的介绍的确很不错,可以直接具体到代码行指出内存泄漏,但是个人使用了一下,发现debug的速度太慢了,不知道是不是我个人程序的问题.......像上面的泄漏,我用CrtSetBreakAlloc这种简单的方法就足够了....