C言語の基礎
C言語で free(p); の直後に p = NULL; と書くことが勧められる理由として、最も適切なものはどれか。
- ANULL を代入しないと、解放した領域が再び使える状態にならず、メモリリークになるから
- 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 は解放した番地を指したままです。