【发布时间】:2010-11-18 10:21:34
【问题描述】:
大家下午好,
我想要完成的工作:我想实现一个 C++ 单元测试夹具的扩展,以检测测试是否分配了内存并且不释放它。我的想法是在测试前后记录分配级别或空闲内存级别。如果它们不匹配,那么您就是在泄漏内存。
到目前为止我所做的尝试:我编写了一个例程来读取 /proc/self/stat 以获取 vm 大小和驻留集大小。居民集大小似乎是我需要的,但显然不正确。它在没有内存分配的连续调用函数之间发生变化。我相信它返回的是使用的缓存内存,而不是分配的内存。它还以 4k 为增量变化,因此太粗糙而无法真正使用。
我可以通过分配一个本地并保存它的地址来获得堆栈大小。这样做有什么问题吗?
有没有办法在 linux 上获得真正的空闲或分配的内存?
谢谢
【问题讨论】:
-
它以 4k 为增量变化,因为这是 Linux 上的默认页面大小。内存是按页分配给进程的,而不是逐字节分配的,因此,如果您谈论的是进程的总体内存消耗,那么这并不是粗粒度的,而是真正发生的事情。
-
如果它显示我使用了 4k 页的内存并且我泄漏了 100 个字节,我可能不会看到我正在使用的 4k 页的数量有任何变化。这就是为什么我说这个应用程序的粒度太粗了
-
在应用程序退出之前,内存可能永远不会返回到操作系统,因此检查内存使用量不是一个可行的测试。注意:应用程序接收 4K 块的内存,然后管理该页面,直到它退出。内存可能会被多次分配和释放,而无需返回操作系统。
-
@Jay 如果泄漏的 100 字节导致您的进程保留一个内存页面,否则它会返回给操作系统,那么可以说您的程序泄漏了 4k 页面。跨度>
-
我想你错过了这个主意。如果它以整数 4k 增量显示已用内存,并且我的泄漏将单元测试程序使用的总内存从 10 页更改为 10.01 页,则两者都将以整数 10 报告给我。泄漏将无法检测到,因为四舍五入。
标签: c++ linux unit-testing