下午好,
我正在努力实现的目标:我想实现对C ++单元测试夹具的扩展,以检测测试是否分配内存并且不释放它。我的想法是在测试之前和之后记录分配级别或可用内存级别。如果它们不匹配则会泄漏记忆。
到目前为止我尝试了什么:我已经编写了一个例程来读取 / proc / self / stat 来获取vm大小和驻留集大小。居民的体型看起来像我需要的但显然不对。它在连续调用函数之间发生变化,没有内存分配。我相信它会返回缓存的内存而不是分配的内存。它也会以4k的增量变化,因此它太粗糙,无法实际使用。
我可以通过分配本地并保存它的地址来获得堆栈大小。这样做有什么问题吗?
有没有办法在linux上获得真正的免费或分配内存?
由于
答案 0 :(得分:4)
您最好的选择可能是使用专门为查找内存泄漏而设计的工具。我有Electric Fence的个人经验,这很容易使用,似乎很好地完成了工作(不确定它将如何处理C ++)。其他人也推荐Dmalloc。
可以肯定的是,每个人似乎都喜欢Valgrind,它几乎可以做任何事情,甚至还有前端(虽然任何有前端构建的东西都意味着它可能不是最简单的世界上的事情)。如果KDE人可以推荐它,它必须能够处理任何事情。 (我不是说KDE有什么不好的,只是它是一个非常大的C ++代码库,所以如果Valgrind可以处理KDE软件,它必须要有它的东西。虽然我没有像电围栏这样的个人经验对我来说总是足够了)
答案 1 :(得分:3)
我必须同意那些建议Valgrind和类似的东西,但是如果运行时开销太大,一个选项可能是使用mallinfo()调用来检索当前分配的内存的统计信息,并检查是否uordblks
非零。
请注意,这必须在调用全局析构函数之前运行 - 因此,如果您有任何已清除的分配,则会记录误报。它也不会告诉你在哪里进行分配 - 但这是一个很好的第一步,以确定哪些测试用例需要工作。
答案 2 :(得分:2)
不要在操作系统上获取分配信息。 C库在内部管理内存,只要求操作系统提供更多内存RAM(在您的情况下为4KB)。在大多数情况下,它永远不会被释放回操作系统,所以你无法真正检查那里的任何东西。
您必须修补malloc()
和free()
以获取所需信息。
或者,使用Valgrind。
答案 3 :(得分:0)
不是直接答案,但您可以重新定义:: new和:: delete运算符,并在内部通过单例或全局对象,跟踪已分配和取消分配的内存。
编辑:如果这是个人的DIY项目,那么很酷。但是如果它对于一些关键的东西你可以总是跳到许多可用的泄漏检测库/程序之一,快速谷歌搜索就足够了。
答案 4 :(得分:0)
google-perftools可用于您的测试代码。