您的位置:首页 > 其它

简单内存泄漏检测方法 解决 Detected memory leaks! 问题

2012-04-21 16:00 621 查看
我的环境是:XPSP2.VS2003
最近在一个项目中,程序退出后都出现内存泄漏:
Detectedmemoryleaks!
Dumpingobjects->
{98500}normalblockat0x05785AD0,152byteslong.
Data:<<NNx7>3CAC4E1000000000BCA44E1078B63700
Objectdumpcomplete.



而且每次退出都是一样的.泄漏的内存块都是98500.
解决方法:
1.在程序开始启动的地方(足够前的地方,只要在泄漏的内存分配的前面)使用代码:
_CrtSetBreakAlloc(98500);//98500为上面内存泄漏的块号.
2.然后debug运行,程序自动断点在"内存块98500"分配的位置:

/*breakintodebuggeratspecificmemoryallocation*/

if(_crtBreakAlloc!=-1L&&lRequest==_crtBreakAlloc)
_CrtDbgBreak();




3.我们已经找到了泄漏的那块内存分配的底层操作的地方了(好拗口!).
这个时候我们利用"调试"–>"退出",快捷键为:"Shift+F11".
跳出当前函数..然后一直往"上"跳,边跳边查看调用栈.直到看到了自己写的代码,例如我的
std::ifstream*origStream=newstd::ifstream();



4.这个时候我已经可以判断origStream分配了内存,但是没有合理释放.处理后再次运行就没有出现内存泄漏了.
5.最后,记得把_CrtSetBreakAlloc(98500);这句话删除掉,不然每次都断点,岂不是烦死..
----------------------------------------------------------------------------------------------------------
写在后面:
关于内存泄漏检测,有一个VisualLeakDetector,按照它的介绍的确很不错,可以直接具体到代码行指出内存泄漏,但是个人使用了一下,发现debug的速度太慢了,不知道是不是我个人程序的问题.......像上面的泄漏,我用CrtSetBreakAlloc这种简单的方法就足够了....
By:洪庚伟
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: