2011-05-17 112 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