C語言基礎
C語言中,建議在 free(p); 之後立刻寫 p = NULL; 的理由,下列何者最適當?
- A若不指派 NULL,已釋放的區域就不會變回可用狀態,造成記憶體洩漏
- Bp 仍指向已釋放的區域,因此可防止重複釋放與釋放後使用,並使錯誤容易發現
- Cfree 會自動把 p 設為 NULL,但為了保險而再寫入一次相同的值來確認
查看答案與解析
正確答案:B. p 仍指向已釋放的區域,因此可防止重複釋放與釋放後使用,並使錯誤容易發現
free(p) 會釋放 p 原本指向的區域,但變數 p 的值(位址)保持不變。之後讀寫 *p 就是釋放後使用,再呼叫一次 free(p) 就是重複釋放,兩者都是未定義行為,可能破壞堆積的管理資訊,而在遠處引發異常。若把 p 設為 NULL,由於規定 free(NULL) 什麼都不做,重複釋放就無害,使用前的 NULL 檢查也能發現錯誤。不過,指向同一區域的其他指標變數仍需另外注意。
- A. 區域在呼叫 free 的時間點就已釋放。指派 NULL 與是否釋放無關。
- B. 正確。可防止釋放後使用與重複釋放,並使其容易發現。
- C. free 不會改變 p 的值。呼叫之後,p 仍指向已釋放的位址。