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

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了_CrtSetBreakAlloc简单内存泄漏检测方法,解决Detected memory leaks!问题相关的知识,希望对你有一定的参考价值。

我的环境是: XP SP2 . VS2003

最近在一个项目中,程序退出后都出现内存泄漏:

Detected memory leaks!
Dumping objects ->
{98500} normal block at 0x05785AD0, 152 bytes long.
Data: << N       N x 7 > 3C AC 4E 10 00 00 00 00 BC A4 4E 10 78 B6 37 00
Object dump complete.
 

而且每次退出都是一样的.泄漏的内存块都是98500.

解决方法:

1. 在程序开始启动的地方(足够前的地方,只要在泄漏的内存分配的前面)使用代码:

_CrtSetBreakAlloc(98500); //98500为上面内存泄漏的块号.

2. 然后debug运行,程序自动断点在"内存块98500"分配的位置:

 

/* break into debugger at specific memory allocation */
if (_crtBreakAlloc != -1L && lRequest == _crtBreakAlloc)
_CrtDbgBreak();
 

 

3 .我们已经找到了泄漏的那块内存分配的底层操作的地方了(好拗口!).

这个时候我们利用 "调试" –> "退出" ,快捷键为:"Shift + F11" .(直接看堆栈更快)

跳出当前函数..然后一直往"上"跳,边跳边查看调用栈.直到看到了自己写的代码,例如我的

std::ifstream* origStream = new std::ifstream();
 

4 .这个时候我已经可以判断 origStream 分配了内存,但是没有合理释放.处理后再次运行就没有出现内存泄漏了.

5.最后,记得把_CrtSetBreakAlloc(98500); 这句话删除掉,不然每次都断点,岂不是烦死..

----------------------------------------------------------------------------------------------------------

写在后面:

关于内存泄漏检测,有一个Visual Leak Detector ,按照它的介绍的确很不错,可以直接具体到代码行指出内存泄漏,但是个人使用了一下,发现debug的速度太慢了,不知道是不是我个人程序的问题.......像上面的泄漏,我用CrtSetBreakAlloc这种简单的方法就足够了....

By: 洪庚伟

转自:http://www.cnblogs.com/G_Weber/archive/2009/04/15/1436362.html

http://blog.csdn.net/qing666888/article/details/50263763

 

以上是关于_CrtSetBreakAlloc简单内存泄漏检测方法,解决Detected memory leaks!问题的主要内容,如果未能解决你的问题,请参考以下文章

swig/python 检测到“uint32_t *”类型的内存泄漏,没有找到析构函数

无法使用 VS2008 内存泄漏检测器

可以在 Visual Studio 的泄漏检测中隐藏安全的内存泄漏吗?

VS2005 检测内存泄漏的方法(转载)

如何用VS工具检测内存泄露

Windows 下的内存泄漏检测方法