检查内存泄漏

时间:2012-04-28 15:39:15

标签: c++ memory-leaks

  

可能重复:
  What is the best way to check for memory leaks in c++?

有一种方法可以在程序结束后检查内存泄漏,还有一种方法可以检查是否存在已分配但尚未释放的内存区域?

例如:

int main()
{
   int *iPtr = new int;

   // Was allocated memory that is not released yet?
   return 0;
   // Memory leaks?
}

5 个答案:

答案 0 :(得分:4)

在Linux上,您可以使用valgrind。在Windows上,您必须搜索分配探查器(有PurifyAQTime 7),使用_CrtDumpMemoryLeaks(特定于msvc,可能会产生误报)或编写覆盖全局运算符的自定义内存管理器新建/删除并报告内存使用情况。

答案 1 :(得分:1)

检查已释放所有已分配的内存只是对抗内存泄漏的一部分。

假设程序在程序操作的每一秒期间分配一兆字节的内存,并且在程序终止之前释放所有这些分配的内存。由于最终释放了所有已分配的内存,严格来说,这不是泄漏。实际上,如果程序预计会运行很长一段时间,就会产生巨大的泄漏。

假设程序可以被重写,以便除了每秒兆字节的一小部分之外的所有部分都可以在运行中释放,剩余分配的内存的微小挖掘机在程序终止时再次释放。严格来说,仍然不是泄漏,但这个程序肯定比原始版本更好。它仍然存在很小的运行时泄漏,因此如果程序运行数周,程序可能仍会产生问题。

现在假设程序可以被重写,因此它的内存消耗永远受到一些合理限制的限制。与通过终止时间释放所有已分配的内存相比,此运行时限制可能更重要。证明这种运行时间的界限很难。测试在程序终止时释放所有已分配的内存是一项更容易的任务。商业工具倾向于关注后者进行泄漏检查。

答案 2 :(得分:0)

您应该尝试使用Valgrind

答案 3 :(得分:0)

对于Visual C ++,Visual Link Detector可能是个不错的选择。

答案 4 :(得分:-3)

据我所知,当您在用户空间中工作并且您的进程终止时,该进程分配的所有内存都将被释放并返回给操作系统。 (操作系统本身正在运行该过程,将内存恢复到他的池中;)) 所以没有什么可以检查的。 如果您在内核空间中运行某些任务,则会有不同的故事,但根据您使用的操作系统,情况可能会有所不同,我想