【发布时间】:2010-06-02 07:52:37
【问题描述】:
我想使用标准实用程序在我的应用程序中查找内存泄漏。 以前我使用自己的内存分配器,但其他人(是的,你 AlienFluid)建议使用 Microsoft 的 Application Verifier,但我似乎无法让它报告我的泄漏。 我有以下简单的应用程序:
#include <iostream>
#include <conio.h>
class X
{
public:
X::X() : m_value(123) {}
private:
int m_value;
};
void main()
{
X *p1 = 0;
X *p2 = 0;
X *p3 = 0;
p1 = new X();
p2 = new X();
p3 = new X();
delete p1;
delete p3;
}
这个测试显然包含内存泄漏:p2 是新的但没有被删除。
我使用以下命令行构建可执行文件:
cl /c /EHsc /Zi /Od /MDd test.cpp
link /debug test.obj
我下载了 Application Verifier (4.0.0665) 并启用了所有检查。
如果我现在运行我的测试应用程序,我可以在 Application Verifier 中看到它的日志,但我没有看到内存泄漏。
问题:
- 为什么应用程序验证程序不报告泄漏?
- 或者应用程序验证程序不是真的要查找漏洞吗?
- 如果没有哪些其他工具可用于在应用程序结束时清楚地报告泄漏(即不通过定期拍摄快照并比较它们,因为这在占用 1GB 或更多的应用程序中是不可能的),包括调用分配位置的堆栈(所以不是 CRT 末尾的简单泄漏报告)
如果我找不到合适的实用程序,我仍然必须依赖我自己的内存管理器(它做得很好)。
【问题讨论】:
-
这就是这些工具的问题——除了我们真正需要的之外,它们什么都做... CRT 内存泄漏检测是否适合您,包括代码中的分配位置,但没有调用堆栈?这种情况下只需要重新定义new操作符并开启内存泄漏转储即可。
-
问题是我有一个完美工作、自写的内存分配器,速度非常快,记录所有内存分配,包括调用堆栈,在应用程序结束时报告泄漏(包括调用堆栈),检查对于缓冲区溢出/下溢,...,但每个人(在 StackOverflow 上)似乎都表明您不能编写自己的内存管理器,因为标准的 CRT/Windows 之一已经足够好,并且有足够的实用程序来查找内存泄漏,覆盖,......但是,我似乎无法让它们工作。
-
我也认为内存泄漏检测不是编写自己的内存分配器的原因。 CRT 提供除了堆栈跟踪之外的所有内容 - 如果您感兴趣,我可以将代码发布给您。
-
@Alex,泄漏检测不是唯一的原因。它也是缓冲区溢出/下溢,更容易发现内存损坏,......我正在尝试为我自己目前正在做的所有事情找到标准替代方案,泄漏检测只是其中之一。当然我对你的代码很感兴趣。可以发一下吗?
-
应用程序验证程序在 exe 中找不到堆跳跃。它在其文档中这么说。它会发现堆损坏(即双重删除)以及其他问题,但根据您的问题,它可能很有用。
标签: c++ windows memory-leaks application-verifier