2

可能重复:
在 C++ 中检查内存泄漏的最佳方法是什么?

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

例如:

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

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

5 回答 5

4

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

于 2012-04-28T15:43:39.993 回答
1

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

假设一个程序在程序运行的每一秒内分配一兆字节的内存,并且所有这些分配的内存在程序终止之前被释放。由于所有分配的内存最终都会被释放,严格来说,这不是泄漏。在实践中,如果预计程序运行时间延长,这会产生巨大的泄漏。

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

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

于 2012-04-28T16:28:36.067 回答
0

您应该尝试使用Valgrind

于 2012-04-28T15:43:11.117 回答
0

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

于 2012-04-28T19:10:48.783 回答
-3

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

于 2012-04-28T15:46:32.000 回答