2014-03-27 93 views
0

如何在C++中枚举所有已分配的对象(由new运算符分配)(不仅是那些具有自己的内存映射的对象,还包括堆中的那些对象?)?枚举分配的对象

我需要这个来查找内存泄漏。

平台:Linux,GCC,I386,AMD_K64(最好:独立平台)

可能没有正式的方式,但也有可能是一个精干的解决方法。 例如,是否有一些内部变量可以访问?也许一个指向用于管理堆的列表的指针?

+1

[massif](http://valgrind.org/info/tools.html#massif) – jsantander

+0

你要求的只是检测器的怪物卡车上的轮胎。为什么不使用众多现有产品之一? – delnan

+0

因为我想构建摩托车:)它应该为用户提供查找视图,而不会在程序中加入太多的权重,以便在程序失败时发现他自己正在发生的事情。但是,现在,我正在尝试地块,其中我不知道它劫持了malloc函数(并且我不知道是否有任何新的调用malloc) – Ohnemichel

回答

0

你总是可以使用valgrind来检查内存泄漏。无论是与你的包管理器安装它,还是下载并编译:http://valgrind.org/

如果您编译在调试模式下您的应用程序可以找出下来到已分配的未释放/删除资源文件/线。

+0

等待! Quote:地块运行程序比正常慢20倍。我无法定期将其添加到我的程序中。 – Ohnemichel

0

您可以使用的valgrind它不正是你想要的(与它自己的实现替代的malloc)和计数分配/释放

+0

从理论上讲,它会造成太多的开销。顺便说一句。没有使用valgrind的反射使用massif.h。漂亮的工具,但没有办法在我的程序中添加功能,例如“让指针指向第n个实例...” – Ohnemichel

0

有可能两种形式的记忆丧失

  1. 内存,这是已分配,但不再从任何地方引用......因此无法将其删除。这是一个正确的泄漏。在Linux中,主要的工具是valgrind。 Valgrind是一个多工具框架。您将要使用的工具是memcheck ....这是一个动态分析工具,将报告有关泄漏和其他内存问题。这比列举分配的内存更进一步,但它也需要检查它是否仍被引用。
  2. 被分配的内存,它仍然被引用,但不知怎的,你已经忘记了它(例如无限增长的矢量,因为没有人永远不会删除它)。这是你需要一个工具来告诉你分配的所有内存的组成。 valgrind可以帮助你。这次的工具叫做massif

我敢肯定还有更多的工具。这些很受欢迎。

在Solaris中,我建议libumem用于Sun Studio中的泄漏跟踪和分析器,以进行分析和内存分析。

+0

我不能使用任何这种功能。我无法从观察过程中找到一种方法(访问内部地块录音)。Valgrind增加了一个巨大的新依赖项,扰乱了程序的身份,甚至可能引入内存泄漏。 – Ohnemichel