C語言基礎
int process(int n) {
int *buf = malloc(n * sizeof(int));
if (buf == NULL) return -1;
if (fill(buf, n) != 0)
return -2;
use(buf, n);
free(buf);
return 0;
}fill 與 use 是另外定義的函式。上方函式的問題點,下列何者正確?
- Afill 回傳0以外的值時,沒有釋放 buf 就返回,配置的區域會一直未被釋放
- B沒有確認 malloc 的回傳值,因此配置失敗時會參考 NULL
- C在 free 之後使用了 buf,因此會參考已釋放的區域
查看答案與解析
正確答案:A. fill 回傳0以外的值時,沒有釋放 buf 就返回,配置的區域會一直未被釋放
以 malloc 配置的區域,在以 free 釋放之前會一直保留。在 fill 失敗並以 return -2 返回的路徑上沒有呼叫 free,buf 的值(位址)也遺失了,因此該區域再也無法釋放。這稱為記憶體洩漏,函式被反覆呼叫時可用的記憶體會持續減少,對長時間持續運作的嵌入式裝置或伺服器尤其是問題。應在返回前呼叫 free(buf),或把釋放處理集中在函式最後的一處。
- A. 正確。在錯誤返回的路徑上沒有呼叫 free,造成記憶體洩漏。
- B. 在 malloc 之後立刻確認了 buf == NULL,失敗時回傳 -1。
- C. 在 free(buf) 之後並沒有使用 buf。