如何跟踪C中的内存使用情况?

时间:2011-10-01 16:49:10

标签: c memory-management

我必须在C中做一个项目,我必须不断为大数据结构分配内存然后释放它。是否存在一个具有有助于跟踪内存使用情况的函数的库,因此我可以确定我是否正确地执行了操作? (我是C的新手)

例如,返回的函数: A)程序当前使用的内存总数,或 B)剩下的总内存, 会做的。我已经用Google搜索并搜索了其他答案。

谢谢!

4 个答案:

答案 0 :(得分:4)

尝试tcmalloc:您正在寻找堆分析器,尽管valgrind最初可能更有用。

答案 1 :(得分:2)

如果您担心内存泄漏,valgrind可能就是您所需要的。另一方面,如果您更关心的是数据结构是否使用了过多的内存,那么在许多unix标准中,您可能只使用公共mallinfo函数作为malloc的扩展名。库包括Linux上的glibc。

答案 2 :(得分:2)

尽管有些人对此进行了侮辱,但史蒂夫马奎尔的书"Writing Solid Code"对于如何在不修改系统内存分配功能的情况下跟踪内存使用情况有很多合理的想法。基本上,不是直接调用原始malloc()等函数,而是调用自己的内存分配API,而不是基于标准函数。您的API可以跟踪分配和释放,检测双重释放,释放未分配的内存,未释放(泄露)的内存,分配内容的完整转储等。您需要从书中获取代码或编写自己的等效代码。一个有趣的问题是为每个分配提供堆栈跟踪;没有标准的方法来确定调用堆栈。 (这本书现在有点过时;它是在C89标准发布几年后编写的,并没有利用const限定词。)

有些人认为这些服务可以由系统malloc()提供;事实上,他们可以,而且这些日子经常如此。您应该仔细查看为您的malloc()版本提供的手册,并确定它是否足以为您提供。如果没有,则包装器API机制是合理的。请注意,使用您自己的API意味着您可以跟踪显式分配的内容,同时保留未编写的库函数以使用系统服务来使用您的API - 实际上,您的代码也是如此。

您还应该查看valgrind。它可以很好地跟踪内存滥用情况,特别是会报告泄漏的内存(已分配但未释放的内存)。当你在分配空间的边界之外读取或写入时,它也会发现,发现缓冲区溢出。

然而,最终,您需要对编写代码的方式保持纪律,确保每次分配内存时,您都知道它何时会被释放。

答案 3 :(得分:0)

每次分配/释放内存时,都可以记录数据结构的大小。

相关问题