【问题标题】:Best way to find memory leaks in a C program在 C 程序中查找内存泄漏的最佳方法
【发布时间】:2011-08-27 14:59:27
【问题描述】:

我正在尝试完成一项大学作业,评分标准指定 5% 用于内存管理 - 特别是没有内存泄漏。

据我了解,简单 C 程序中的内存泄漏仅由程序放弃的指针引起 - 即 malloc/calloc/etc 调用,它们永远不会有相应的free

我的问题分为三个部分:

  1. Solaris 上最简单的方法是什么 和 OSX 来“证明”你没有 泄露任何内存?
  2. XCode 是否有 任何有助于确定记忆的工具 泄漏?
  3. 操作系统是否 释放所有先前分配的 c程序中的内存一旦 进程结束?

【问题讨论】:

  • 编号1比听起来更复杂。这也意味着你的 fopen 需要一个 fclose,你的 createFoo() 需要一个 destroyFoo()。
  • 不是您问题的答案,但值得一提的是:您的讲师对 memleaks 的看法可能与现实世界中重要的不同。尽管被 valgrint 等工具捕获,但有限数量的未释放分配(独立于程序处理的任何数据)并不是真正的内存泄漏,而数据相关的分配在数据不再被使用后仍然存在,并且只会被清理在程序退出时,真正的泄漏,尽管没有工具可以检测到它们。
  • 你可以试试 deleaker 但它只适用于 windows(

标签: c macos pointers memory-management


【解决方案1】:

Valgrind 是你的朋友。

【讨论】:

  • 我似乎无法让 Valgrind 在 OSX 上构建,而且似乎任何地方都没有二进制文件。有其他选择吗?
  • brew install valgrind 警告您 OS X Mavericks or older is required. 这是 OSX 10.9。当前版本是 10.10.4。
  • 不确定我能做些什么。 (?)
【解决方案2】:
  1. 对于每个 malloc(),您需要确保您只有一个 free()。
  2. 我没有使用过 XCode,但this 论坛条目可能会有所帮助。
  3. 是的。但是,让正在运行的程序“泄漏”仍然是一种糟糕的形式。

一般来说,学习如何在不使用内存调试器(早期)之类的工具的情况下避免泄漏是一个好主意——尤其是对于您的简单程序。然而,这很痛苦:在构建任何重要的东西时,你会想要开始学习如何使用更高级的调试工具(如 Valgrind,正如 Alex Reynolds 在另一个答案中所建议的那样。)

【讨论】:

  • 参考其他答案时,千万不要说“上”或“下”,因为答案的顺序不固定。只需说“亚历克斯的回答”之类的话。
【解决方案3】:

Mac OS 的答案和要避免的示例(为您节省了半小时)。


Mac OS 不附带 Valgrind 或 dmalloc。此外,在尝试将 Valgrind 安装到 Sierra 时,它存在一些兼容性问题。

有一个名为“leaks”的实用程序,我通过这个来运行它:

leaks -atExit --/Contents/Developer/usr/lib/libLeaksAtExit.dylib ./a.out

不幸的是,这没有报告明显的内存泄漏...也许我用错了,但我只是在寻找一种简单的方法来检查我的C 程序按应有的方式释放了它的内存。

如果你有时间,那么也许阅读并使用Using OSX Leaks for C Programs on the Command Line?

资源:

  1. Finding Memory Leaks
  2. Using the "leaks" command on a C/C++ executable

PS:也许如果与“iprofiler”一起使用,那么它可能会有用,但我没有安装它。

【讨论】:

    【解决方案4】:

    还有dmalloc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多