Valgrind只能检测到或多或少没有被删除的指针。当你不需要它们时保持它们是另一个问题。
首先,关闭时释放所有对象和内存。如果发生泄漏,valgrind会将其检测为未由对象引用的内存等。然而,操作系统最终会释放任何泄漏。
如果你正在捕捉所有的例外(...)并且没有对它们做任何事情,那么不要这样做。这是一个常见原因。其次,在关机期间调用的析构函数的日志文件可能会有所帮助。也许在main()结束时,设置一个全局标志;在设置该标志时调用的任何析构函数都可以输出它们存在的结果。看看是否有很多对象不应该在那里。
稍微简单一点,你可以使用一个全局变量,每个ctor可以递增1,而dtor递减1.如果你发现对象的数量不是相对保持不变,你可以调查哪些正在使用类似的技术来解决问题。
第三,使用Boost及其范围智能指针来提供帮助,但不要依赖智能指针作为圣杯。
有我可能遇到的潜在问题。对于长时间运行的程序,内存碎片会导致大量内存使用。您可以删除一个1MB对象,然后尝试创建一个2MB对象;创作将会进入新空间,因为1MB“免费大块”不够大。然后当你创建一个512kb的对象时,它可能会进入该1mb对象的空间,只使用1/2的可用空间,但是这样做可以让你的下一个1mb对象需要在大空间中分配。
不幸的是,这个问题会变得很糟糕,因为在持久的地方分配了小对象。例如,可能有50字节的类在内存中分开300kb,并且像其中的100字节一样,但是在该空间中不能分配512kb的对象,因此它为每个新对象分配了额外的512kb,有效地浪费了90%免费“空间,即使你的程序已经拥有足够多的空间。
这个问题很难作为确定的原因追查,但如果你检查你的程序的流程,寻找小的分配。记住std :: list/vector/etc。都可以造成这种情况;如果你正在寻找一个守护进程来执行大量的内存操作,那么使用reserve()预分配内存是一个好主意。内存池甚至更好。
根据您想要放入的时间,您也可以创建(或查找)自定义内存分配器,以便在关闭对象时报告对象。
您的代码可能不会以传统意义上泄漏内存,但是这些类型的资源问题偶尔会出现,即使您知道代码进出,通常也很难找到。没有看到你的代码,就不可能知道发生了什么。 – Chad 2012-04-02 18:58:31
在这种情况下,Valgrind的工具Massif可能比缺省工具Memcheck更有用。 – ninjalj 2012-04-02 19:00:24