2015-12-20 104 views
1

我會很高興,如果有人可以幫助我理解完全以下代碼之間的區別:malloc會在函數結束時自動釋放內存嗎?

// Code (1) 
void f1 (void){ 
    int * ptr1 = malloc (sizeof(int)); 
} 

// Code (2) 
void f2 (void){ 
    int * ptr2 = malloc (sizeof(int)); 
    free(ptr2); 
} 

據我所知,自由的指令是用於重新分配有用但是另一方面,我知道每次我們調用一個函數g時,如果這裏有新的變量需要聲明,它們將在g執行後被創建和銷燬(即釋放,對嗎?)。

結果:

我們需要使用指令自由代碼(2),或者它是多餘的? (但也許建議使代碼更清晰)

感謝

PS:你可能也有興趣幫助我My previous related question。在那裏,一些用戶建議使用內存的動態分配,我試圖理解爲什麼/如何。

+2

不,你將不得不使用免費的' – CoderPi

+0

請注意,還有另一個分配函數['alloca'](http://linux.die.net/man/3/alloca),它*在調用函數結束時自動釋放內存。不過,我從來沒有見過它用過。我認爲這是因爲大多數開發人員都認爲,支持'alloca'所需的額外簿記並不能證明它的用途,而只是確保您的'malloc'和'free''調用已正確配對。 – DaoWen

+0

@DaoWen:在C標準或POSIX中沒有描述'alloca()'。 – pmg

回答

7

malloc不會釋放分配的內存。您需要使用free釋放分配的塊。
在程序結束時(main函數),系統也會自動釋放分配的內存,但最好是明確釋放它。

一定要記住,動態分配的內存的生命週期,直到程序結束,如果它沒有具體解除分配。

+0

謝謝,我的觀點非常有趣! 因此,一般規則「在函數中創建的每個新變量都將在最後被銷燬」爲false,「malloc case」是一個重要的例外,對嗎? – Biagio

+0

@Biagio;是。如果有一個'staic'局部變量,那麼它的生命週期也將是程序的結束。 – haccks

5

正如前文所說,通過malloc分配的內存應該由free取消分配,否則你會得到內存泄漏。令你困惑的是ptr1 var本身是未分配的(不是它所指向的內存)。 分配的內存不是變量。因此,當您退出f1時,您無法再訪問您分配的內存,因爲您已經丟失了該地址。 順便說一句,你沒有解釋爲什麼你需要在你之前的問題中的新地址。

1

除了其他的答案解釋有關C dynamic memory allocation和需要顯式調用free每個malloc -ed數據(和調用free是一個問題,你想避免memory leaks),你會發現一個像valgrind這樣的工具很有幫助,你也可以用考慮使用Boehm's garbage collector。你基本上可以在你的整個程序中用malloc替換成GC_malloc,而且不需要明確表示free -ing。

當然,請閱讀garbage collection上的Wikipage。它確實有一些警告。所以Boehm的GC是not a silver bullet

1

否,malloc()在函數終止時不會釋放內存。

如果我可以提供雖然建議...

如果你想分配空間(對於(非常)小的物體)只有在整個(非遞歸)功能,您可以使用C99's variable length arrays

int foobar(size_t small_n) { 
    struct whatever autorelease[small_n]; // C99 VLA 
    // use autorelease 
    // no need to free 
    return 0; 
} // memory for autorelease object released 
相關問題