2010-01-19 104 views
2

我有一個命令行C程序,我使用calloc()函數爲一個結構分配一些內存,該結構也有一個結構體,並且分配了一些內存。使用後釋放內存

如果我使用free()函數從父結構中釋放內存,它是否也會從子結構釋放內存?

或者我應該首先從子結構中釋放內存?

+0

有點相關:http://stackoverflow.com/questions/1941323/always-check-malloced-memory – jldupont 2010-01-19 17:15:06

+0

你還使用calloc/malloc的子結構? – quinmars 2010-01-19 18:17:46

+0

如果您在子結構上使用calloc(),則必須在該內存上使用free()。否則,當你的程序運行時,它會逐漸佔用越來越多的內存。 (如果你的程序在退出之前並沒有做太多的事情,但是如果你在循環中這樣做,你甚至可能會崩潰。) – egrunin 2010-01-20 02:13:33

回答

13

它是一個簡單的規則,對於你所做的每個內存分配,你必須自己明確釋放內存。所以,你需要自己釋放孩子的記憶。

+6

在釋放父結構之前,你至少需要獲取指向子內存的指針 - 確保代碼不會訪問釋放的內存。或者,只需在父母面前釋放子結構 - 一個用於後續遍歷任何樹結構的例子。 – 2010-01-19 18:18:12

6

不,你需要首先釋放孩子的記憶。

0

這取決於免費後結構會發生什麼。只要free()之後沒有引用結構就一切正常。如果釋放被調用,然後某些代碼引用釋放的內存,則可能會發生非常難以調試的事情。不要做後者。

0

由於所有分配的內存在程序終止時被釋放,因此可能不需要釋放內存。如果你想節省內存使用,你只需要調用free()。

+0

如果在循環內部創建並刪除父結構會怎麼樣? – egrunin 2010-01-20 02:14:27

0

我認爲值得一提的是,對於短期運行的命令行工具來說,這通常沒有關係。一旦你的程序運行完畢,操作系統將收回所有的內存。但是,如果這是一個運行時間不確定的工具,則您需要擔心內存管理,其他答案有很好的建議。

+5

我認爲說'讓操作系統照顧它'是個不好的建議,即使它是針對一個小程序的。你不想養成編寫漏碼的習慣。 – Trent 2010-01-19 17:24:07

1

總是首先釋放子結構。編寫可釋放每種類型結構的函數可能是明智的選擇,以簡化壽命。如果structTypeA包含structTypeB和StructTypeC,這將允許您簡單地調用freeStructTypeA(指向sTA實例的指針)並讓該函數在釋放structTypeA本身之前釋放所有子結構。

在相關說明中,您最好嘗試通過valgrind運行代碼,以確保您正確釋放所有內存。

+0

我完全同意。如果一個結構包含動態分配的子對象,通常最容易編寫一個函數來處理釋放該結構和所有關聯的子對象。 – bta 2010-01-20 01:32:36