2011-05-17 82 views
3

我正在尝试完成大学任务,并且标记标准为内存管理指定了5% - 专门用于没有内存泄漏。在C程序中查找内存泄漏的最佳方法

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

我的问题是在3个部分:

  1. 请告诉我在Solaris 和OSX最简单的方法来“证明”你有没有 泄露任何内存?
  2. 是否有XCode有 任何工具来帮助确定内存 泄漏?
  3. 一旦 进程结束,操作系统 是否会释放之前在c程序中分配的所有以前分配的内存 ?
+2

Nr。 1听起来更复杂。这也意味着你的fopen需要一个fclose,而createFoo()需要destroyFoo()。 – Mel 2011-05-17 22:30:31

+0

不是你的问题的答案,但值得一提的是:你的教师对memleaks的想法可能与现实世界中的问题不同。有限数量的未实现的分配(独立于程序进程的任何数据)并不是真正的内存泄漏,尽管被valgrint之类的工具捕获,而在数据不再使用之后依然依赖于数据的分配,只能被清理干净在程序退出时,尽管事实上没有工具可以检测到它们,但它们都是真实的泄漏。 – 2011-05-17 23:01:21

+0

您可以尝试删除,但它只适用于Windows( – MastAvalons 2012-02-06 21:21:07

回答

5

Valgrind是你的朋友。

+0

我似乎不能让Valgrind建立在OSX上,并且似乎没有任何一个二进制文件。是否有其他选择? – Ash 2011-05-17 23:53:51

+0

http://valgrind.org/downloads /repository.html – 2011-05-17 23:55:46

+0

另请参阅MacPorts:http://www.macports.org/ports.php?by = name&substr = valgrind – 2011-05-17 23:59:54

3
  1. 对于每个malloc(),您需要确保您只有一个free()。
  2. 我还没有与XCode合作,但this论坛条目可能会有所帮助。
  3. 是的。但是,让你的跑步程序“泄漏”仍然是一个糟糕的形式。

一般来说,学习如何在不使用内存调试器等工具的情况下学习如何避免泄漏是一个好主意(早期) - 特别是对于简单的程序。这是痛苦的,但是:当涉及到建设什么不平凡的你要开始学习如何使用更先进的调试工具

+0

当提到其他答案时,不要说“高于”或“低于”,因为答案的顺序是不固定的。说一些像“亚历克斯的回答” – cjm 2011-05-17 22:59:59

+0

感谢您的提示,我会编辑答案=) – Joe 2011-05-17 23:02:30