代码之家  ›  专栏  ›  技术社区  ›  Benubird

检测C中的内存泄漏

  •  1
  • Benubird  · 技术社区  · 14 年前

    我知道这不是一个新问题,但我在其他地方还没有找到有效的方法。 我有一个C程序,它在运行时稳定地消耗内存——我使用“free”命令跟踪它,我可以看到只要它执行,可用内存量就会减少,这不应该发生。但是,我在程序中找不到任何可能导致这种情况的东西。我也用valgrind和dmalloc测试过,它们中的任何一个都能检测出任何记忆丢失。

    我怎样才能找到漏洞?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Raveline    14 年前

    如果你确定 你的 使用内存,也许不是 你的 马洛奇和自由是问题所在。

    如果你在使用libs,你应该仔细检查你是否正确使用了它们。很多都有初始化和释放功能,您很容易忘记,从而导致内存泄漏。

        2
  •  3
  •   Bob Jarvis - Слава Україні    14 年前

    内存是真的泄漏了,还是程序运行的时间越长,消耗的内存就越多?换言之,程序是否正在构建一个简单地继续增长的大型动态数据结构(链表等)?只要程序有一个指向内存的指针,它就不是真正的泄漏——但是如果分配从未被释放,那么每个新的分配都将从操作系统中获得更多的内存。这也可以解释为什么你使用的工具没有“泄漏”。

    当我不得不这样做的时候,我已经做了一些事情,比如每次我的程序分配内存并释放内存时,都会向平面文件写入日志消息。这些消息将包括文件名和分配内存的程序行,以及分配内存时从malloc返回的地址,或者同样地包括释放内存和释放缓冲区的文件名和程序行。然后,您可以按地址对结果文件进行排序,那些带有“ALLOCATE”消息但没有“FREE”消息的地址可能已经泄漏,或者至少在程序终止时没有被释放。这可能是一个耗时的实现和自动化工具是更好的,如果你有他们-但根据你的情况,你可能不得不这样做。

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

    分享和享受。