2016-11-21 139 views
0

正如我在閱讀,有需要使用free(),但接下來發生了什麼?我的意思是,如果我有這樣的事情:使用free(),稍後會發生什麼?

char word[] = "abc"; 
char *copy; 
copy = (char*) malloc(sizeof(char) * (strlen(word) + 1)); 
strcpy(copy, word); 
free(copy); 
printf("%s", copy); 

它會寫我「abc」。爲什麼?

+6

訪問釋放的內存觸發*未定義行爲*。沒有「爲什麼」。任何事情都可能發生。 (並停止投射'malloc'的結果)。 – AnT

+0

[malloc/free。可能重複。可以從釋放的內存中讀取](http://stackoverflow.com/questions/9673733/malloc-free-can-read-from-freed-memory) –

回答

4

使用free()後,你的指針copy仍指向同一個內存位置。 free()實際上並沒有刪除內存中寫的內容,而是告訴內存管理你不再需要那部分內存。 這就是爲什麼它仍然輸出abc。但是,您的操作系統可能會將該內存重新分配給其他應用程序或您在應用程序中分配的一些新內容。如果你不走運,你會得到分段錯誤。

+4

我也許會將這句話改爲「如果你是幸運的,你會得到分段故障「 – schil227

+0

當然,你是對的。如果你很不幸,你會覆蓋已經使用過的內存,而不會有任何警告或錯誤,不知道是否有晦澀的錯誤。 – clocktown

2

free()取消分配先前由calloc,malloc或realloc分配的內存。您不應該訪問已經釋放的內存,因爲行爲沒有定義。這只是一個巧合,它仍然認爲它是以前的內容。

使用工具作爲valgrind是一個好主意,它可以告訴你(除其他事項外)是否嘗試訪問釋放內存。在Linux終端,你可以做這樣的:

valgrind ./yourProgram

0

這裏是它explayned相當不錯:

C Reference -- free()

釋放內存並不意味着沒有數據了。

內存只是免費的新分配。

訪問它將導致未定義的行爲。

0

正如其他人所說,當代碼引用釋放的指針時,行爲是未定義的。在這種情況下,你正在閱讀它。但是,寫入很可能不被允許,並且您應該看到分段錯誤。

我建議您使用MALLOCDEBUG(例如,在AIX上它將是MALLOCDEBUG=validate_ptrs)或您的平臺上的類似環境變量運行它,以便您能夠捕獲此錯誤。但是打開MALLOCDEBUG會對您的程序產生嚴重的性能影響。另一種方法是寫自己的免費程序還設置如下圖所示的釋放的指針明確NULL:

#define MYFREE(x) do { free((x)); (x) = NULL; } while(0);