检测C中的内存泄漏

时间:2010-11-19 11:36:28

标签: c debugging memory-leaks

我知道这不是一个新问题,但我在其他地方找不到任何有用的东西。 我有一个C程序在运行时稳定地占用内存 - 我使用'free'命令来跟踪它,我可以看到可用内存量随着执行而减少,这应该不会发生。但是,我在程序本身中找不到可能导致此问题的任何内容。我还用valgrind和dmalloc对它进行了测试,并且他们能够检测到任何内存丢失。

我如何找到泄漏?

2 个答案:

答案 0 :(得分:3)

如果您确定 对内存的使用,可能不是您的 mallocs和释放问题。

如果您正在使用任何库,则应仔细检查您是否正确使用它们。许多都具有初始化和释放功能,您可以轻松忘记这些功能,从而导致内存泄漏。

答案 1 :(得分:3)

内存是否实际泄露,或者程序运行的时间越长,消耗的内存越多?换句话说,该程序是否可能构建一个大型动态数据结构(链表等),并继续增长?只要程序有一个指向内存的指针,它就不是真正的泄漏 - 但如果从未释放分配,则每个新分配将从操作系统获得更多内存。这也可以解释为什么你使用的工具没有报告“泄漏”。

当我必须这样做的时候,每次我的程序分配内存并释放它时,我都会做一些事情,例如将日志消息写入平面文件。消息将包括分配内存的文件名和程序行以及分配内存时从malloc返回的地址,或者同样释放内存的文件名和程序行以及释放缓冲区的地址。然后,您可以按地址对生成的文件进行排序,并且那些带有“ALLOCATE”消息但没有“FREE”消息的地址可能已泄露 - 或者至少在程序终止时未被释放。实施起来可能非常耗时,而且如果你拥有它们,自动化工具会更好 - 但根据你的具体情况,你可能需要这样做。

或者,您可能只想使用垃圾收集器。 Boehm收藏家可能会为你工作 - 看看http://www.hpl.hp.com/personal/Hans_Boehm/gc/

分享并享受。