可以报​​告哪些类型的误报内存泄漏?

时间:2009-08-19 13:04:58

标签: c++ memory-leaks

当您使用某种“工具”(例如WinDbg,GlowCode或甚至集成的Visual C ++泄漏报告器)查找内存泄漏时,可以报告哪些类型的误报?

事实上,GlowCode警告你不要误报。根据您运行的扫描类型,可能会出现更多误报。

有了这个问题,我正在试图弄清楚GlowCode扫描仪与WinDbg的!heap -l的比较......

我很感激您提供的任何暗示!

更新:如果您可以在C ++(或您的首选语言)中提供一些非常有用的真实示例。

3 个答案:

答案 0 :(得分:1)

内存调试程序的一般方法是在程序退出时报告所有已分配的内存。这个内存可能会被泄露,但它可能只是为应用程序的整个生命周期分配的内存,并且从未明确发布(本身就是一个可疑的编程实践)。

其他工具(例如静态分析器)尝试匹配alloc / release调用或某些编程模式。例如,MS prefast工具将警告您,如果您分配内存并调用可以在没有try块的情况下抛出异常的函数。这种情况可能是误报的一种情况是分配的对象在其父节点被销毁时自动删除。

答案 1 :(得分:1)

泄漏检测仪报告了两种内存:

  • 不再可达的内存(即无法从全局变量中获取指向它们的指针)。如果您使用技巧来隐藏值指针,那么这里可能存在误报(在某种意义上内存仍然可以访问)。其中一些是合格的,一些是在实践中但不是。它们通常具有可疑性,但在记忆紧张的情况下工作时可以派上用场。从嵌入式8位系统开始,我就没有使用过它们。这些通常在代码库中很少见。

  • 在程序结束时仍可访问但尚未释放的内存。这种可以被称为“误报”。这种用法是一种风格问题;人们可能会质疑在退出程序时不删除对象的做法的正确性,因为人们可能会质疑做出不可观察的工作的效用,就运行时被忽略而言,这是不可观察的。请注意,有时,它是故意完成的,因此对象可以在程序退出时调用的静态析构函数中使用。

答案 2 :(得分:1)

假设您已在地址A和地址B分配了内存,并将值保存到相应的指针。然后分别用(A + B)和(A-B)替换A和B值。

在世界上,如果检查者猜测内存仍然可以访问?你真的可以恢复原始指针值,也许你真的在某处。但它应该如何猜测呢?如果你用三角函数或比如RSA来破坏这些值? :)

还有一件事。你听起来更多的误报意味着更糟糕的工具。但是,通常,当假阳性的数量增加时,假阴性的数量减少。这就像成为一个更可疑的侦探,抓住一个难以捉摸的罪犯,但同时劫持更多无辜的人。