程式碼片段:
char *str = malloc(100);
strcpy(str, "hello");
free(str);
printf("%s", str); // 輸出 "hello" —— 未定義行為
free(str) 僅將記憶體區塊標記為「可重複使用」,並 不會清零或覆寫 原有資料。str 仍指向原位址(成為「懸空指標」),資料暫時殘留,故 printf 偶爾能讀到舊值。malloc、系統整理堆疊、或最佳化編譯器假設指標有效而移除存取,皆可能導致崩潰或輸出亂碼。free(str);
str = NULL; // 避免誤用懸空指標
啟用 AddressSanitizer (-fsanitize=address) 或 Valgrind 即可偵測「use-after-free」錯誤。