内存泄漏查找器






3.68/5 (39投票s)
自定义内存处理程序,具有内存泄漏报告和无主区检查功能。 泄漏会报告分配的调用堆栈。
引言
你曾经遇到过内存泄漏吗? 希望知道你在哪里分配了它以及如何分配的吗? 你的老板很吝啬,拒绝购买 Boundchecker 或其他调试工具吗?
这是给你的解决方案。 直接编译到你的代码中的内存泄漏检测器。 它报告内存泄漏,并带有分配的调用堆栈,可下溯到用户定义的深度。
作为一个附加组件,它对内存块之前和之后进行简单的检查,以跟踪缓冲区覆盖。
用法
在你的项目中包含tracealloc.cpp。 在项目设置中定义DETECT_LEAKS
。 编译。 运行你的应用程序。 当应用程序终止时,内存泄漏会报告到你的调试输出窗口中。 只需单击内存泄漏,就会显示正确的文件和行。
你可以在源代码中找到更多说明。
它是如何实现的?
该代码会重写运算符new
和运算符delete
。 对于每次进行的分配,该代码都会分配额外的空间用于跟踪、调用堆栈和无主区。 获取并记住当前的调用堆栈,最后代码将新分配的块放在一个链表中,并返回请求的内存。
当删除一个内存块时,会找到头部并检查是否存在缓冲区覆盖。 然后从链表中删除该内存块并解除分配。
当程序终止时,全局内存跟踪器对象会被删除。 析构函数会遍历链表以查找未删除的内存块(= 泄漏的内存)。 然后,它获取调用堆栈的符号信息,并将信息转储到调试控制台中。
限制
该代码是 Microsoft Visual Studio 和 Win32 特定的。 它需要调试版本。 该代码是 C++ 特定的。 它处理new
/delete
,但不处理malloc
/free
。 激活泄漏检测后,代码运行速度会变慢(大致为正常调试版本速度的一半)。
最后
我要感谢 Zoltan Csizmadia 编写了 ExtendedTrace
。 我使用了他代码的一部分用于堆栈行走和符号查找。
我还要感谢 Code Project 社区。 我在这里找到了许多解决方案或正确的方向。 我希望我能通过这次贡献回报一些东西。
谢谢!
历史
- 2012 年 2 月 22 日
- 包含贡献的错误修复(作者在自述文件中确认)
- 将解决方案升级到 Visual Studio 2010