2009-08-26 23 views
10

my previous question有很大關係,但我發現這是一個單獨的問題,我無法找到一個堅實的答案。由於超出範圍而釋放(字符)數組的內存?

由超出範圍釋放((字符)數組使用的內存?

一個例子:

void method1() 
{ 
    char str[10]; 
    // manipulate str 
} 

所以方法1調用後,被釋放,或者我需要顯式調用免費這個問題,以及由乙方(10個字節)使用的內存?

我的直覺告訴我這只是一個簡單的原始類型數組,因此它會自動釋放。我有疑問,因爲在C中,你不能假設任何東西都會被自動釋放。

回答

18

在這種情況下,你不需要免費打電話。值「str」是一個基於堆棧的值,當該特定方法/範圍退出時將被清除。

您只需要通過malloc顯式創建的值來調用free。

+1

(其中「否」表示 - 是的,通過超出範圍是免費的,沒有你不需要明確地打電話) – jmanning2k 2009-08-26 14:48:08

+0

@ jmanning2k我重新閱讀我的文章,並將其編輯爲有點更清楚什麼是「不」意思 – JaredPar 2009-08-26 14:48:36

1

不,這種類型的局部變量被分配在堆棧上,所以當你從程序返回時,內存可用於下一次函數調用,它將使用內存作爲其棧幀。

如果您使用malloc(),則會在堆上分配空間,該空間必須明確釋放。

9

它被自動釋放。如果你沒有malloc它,你不需要釋放它。但是這與 「簡單的原始類型數組」無關 - 如果它是 結構數組,它將被釋放。它被釋放,因爲它是一個局部變量。

鑑於您正在問這些非常基本的問題,我必須問您正在使用哪本C教科書。就個人而言,我不相信你可以在沒有 閱讀Kernighan &裏奇的The C Programming Language,這對 解釋所有這些東西非常清楚C有用。

+0

優秀的建議! – Lazarus 2009-08-26 15:22:14

+0

我實際上是通過K&R閱讀(和研究)C語言程序設計語言的,但那是在一段時間之前,我實際上「進入」C自己多一點。 – pbean 2009-09-23 11:41:39

0

我認爲它被釋放不是因爲它是原語,而是它是一個局部變量,它將被分配到堆棧而不是堆。如果你不malloc它,那麼你不能釋放它,據我所知。

0

是的,它在超出範圍時被「釋放」。
不,你不必明確地釋放它。

char數組在堆棧中分配,所以當您從函數返回時,該堆棧空間是可重用的。你不需要明確地釋放內存。

好經驗法則:如果你malloc,你必須free

+0

問題是關於C,而不是C++ – 2009-08-26 16:56:29

+0

啊,是的,確實如此。讓我解決這個問題。 – 2009-08-26 19:53:17

3

是的,它被「釋放」。 (不是免費的),但是。)

由於str是一個自動變量,它只會持續到它的作用域,直到函數塊結束。

請注意,你只有free()你malloc()。

2

是的,一旦method1返回,內存會自動釋放。 str的內存分配在堆棧上,並在清除方法的堆棧幀後釋放。將它與堆中分配的內存(通過malloc)進行比較,您必須明確釋放這些內存。

0

我在C/C++最近有點生疏,但我認爲你是對的。只要你沒有動態分配內存,你應該沒問題。