正如我在閱讀,有需要使用free()
,但接下來發生了什麼?我的意思是,如果我有這樣的事情:使用free(),稍後會發生什麼?
char word[] = "abc";
char *copy;
copy = (char*) malloc(sizeof(char) * (strlen(word) + 1));
strcpy(copy, word);
free(copy);
printf("%s", copy);
它會寫我「abc」。爲什麼?
正如我在閱讀,有需要使用free()
,但接下來發生了什麼?我的意思是,如果我有這樣的事情:使用free(),稍後會發生什麼?
char word[] = "abc";
char *copy;
copy = (char*) malloc(sizeof(char) * (strlen(word) + 1));
strcpy(copy, word);
free(copy);
printf("%s", copy);
它會寫我「abc」。爲什麼?
free()
取消分配先前由calloc,malloc或realloc分配的內存。您不應該訪問已經釋放的內存,因爲行爲沒有定義。這只是一個巧合,它仍然認爲它是以前的內容。
使用工具作爲valgrind是一個好主意,它可以告訴你(除其他事項外)是否嘗試訪問釋放內存。在Linux終端,你可以做這樣的:
valgrind ./yourProgram
正如其他人所說,當代碼引用釋放的指針時,行爲是未定義的。在這種情況下,你正在閱讀它。但是,寫入很可能不被允許,並且您應該看到分段錯誤。
我建議您使用MALLOCDEBUG(例如,在AIX上它將是MALLOCDEBUG=validate_ptrs
)或您的平臺上的類似環境變量運行它,以便您能夠捕獲此錯誤。但是打開MALLOCDEBUG會對您的程序產生嚴重的性能影響。另一種方法是寫自己的免費程序還設置如下圖所示的釋放的指針明確NULL:
#define MYFREE(x) do { free((x)); (x) = NULL; } while(0);
訪問釋放的內存觸發*未定義行爲*。沒有「爲什麼」。任何事情都可能發生。 (並停止投射'malloc'的結果)。 – AnT
[malloc/free。可能重複。可以從釋放的內存中讀取](http://stackoverflow.com/questions/9673733/malloc-free-can-read-from-freed-memory) –