【发布时间】:2021-10-22 06:57:36
【问题描述】:
在 C++ 程序中,我有时会遇到 "weak" 内存泄漏问题。我的意思是,一些对象会积累资源,但最终这些对象会被正确销毁并释放它们的内存,因此这些泄漏不会使用传统的内存调试工具(如 valgrind 或地址清理器)出现。
一个典型的例子是一个写得很糟糕的缓存,它保留了程序开始时所有的缓存结果。它会永远增长,但它的内存会在程序结束时,即缓存被销毁时回收。
如何调试这个?是否有工具可以查看程序分配的最大对象在哪里?转储分配内存的当前状态(包括调用堆栈)?看看哪些对象在增长?我正在使用 Linux,但我也对其他平台感兴趣。
【问题讨论】:
-
否,因为通常这种分配方案是在 malloc 和 family 之上处理的。这些库需要提供一些方法来从中提取有用的使用信息。不会有通用的灵丹妙药解决方案。
-
Valgrind 的 massif 应该对此有用。
-
很难说,因为(例如)不断增长的容器可能是预期的。在这些情况下,内存浪费(所谓的“弱”内存泄漏)与预期行为之间的区别可能很难确定。
-
@dratenik 这听起来很有趣,我必须去挖掘!
-
我写了一个工具(heob; 仅限 Windows),它有一个特殊的模式额外用于这种内存泄漏:1)从禁用泄漏记录开始,让程序进行第一次迭代它的工作量,所以一切都被初始化。 2) 启用泄漏记录,并让程序对其工作负载进行另一次迭代。 3) 再次禁用泄漏记录,并再次让程序对其工作负载进行另一次迭代。 4) 显示启用了泄漏记录的迭代的所有剩余内存块(应该包含那些“弱”内存泄漏)。
标签: c++ memory-leaks