2014-09-28 100 views
-1

考慮的變量與malloc定義(char *)sTmp「malloc」ed內存是否隱式釋放?

如果我分配另一個變量此sTmp,確實通過這個變量分配的存儲器獲得自動釋放或這是否存儲塊保持直到該過程結束分配(&無用) ?

讓我用一個代碼解釋:

int main() { 
    char *sTmp = (char *) malloc (50); 
    char *sNew = strdup ("some text"); // length is less than 50 
    sTmp = sNew; 
    /* now sTmp points to sNew and it's length is 10 chars 
     I wonder, what happened to the allocated memory of 50 chars in the first line; 
     Does it get freed implicitly or remain allocated? 
    */ 
} 
+0

您已經創建了內存泄漏。內存仍然分配。 – perh 2014-09-28 11:55:48

回答

2

由於某些內存區域爲malloc -ed,但不是free -d,因此您有memory leak。但是,在大多數操作系統上(特別是在Linux和其他POSIX系統上),操作系統在終止一個process後釋放所有資源(包括內存)。所以你可能會決定不打擾太多(至少對於數據是malloc-只在創業時間一次)。

你可以使用一些內存泄漏檢測儀像valgrind,你應該與所有警告和調試信息(如gcc -Wall -g)編譯和使用調試器(如gdb

順便說一句,你可以考慮使用一個garbage collector,像Boehm's conservative garbage collector 。然後,您將使用GC_MALLOC而不是malloc,GC_STRDUP而不是strdup,並且您不會打擾致電free(如果您這麼做了,則會改爲撥打GC_FREE)。 GC通常會釋放無法訪問的內存。

+0

好的......我對C很陌生,而不是搞亂「垃圾收集器」,我寧願保持清醒狀態,並明確地繼續釋放內存。謝謝。 – ssd 2014-09-28 12:14:34

+1

我相信你至少應該知道*垃圾收集技術和術語(至少,閱讀鏈接的wikipage)。另外,請了解如何使用調試器和內存泄漏檢測器。 – 2014-09-28 12:27:15

4

是否「malloc的」 ED內存得到釋放含蓄?

沒有,是C.

沒有垃圾收集機制,你必須明確地freemalloc

sTmp = sNew; 

分配內存時,該賦值語句會導致內存泄漏,釋放對象在分配之前。

1

內存被分配並且指針丟失,現在您不能釋放此內存直到程序結束