解放後の使用
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2019/02/17 16:10 UTC 版)
ポインタがfree関数に渡され、メモリが解放された後でその領域への参照を行っても、その内容は未定義であり利用できない。しかし、ポインタ自体が残っていると誤って使ってしまうことがある。次のコードはその例である。 int *ptr = malloc(sizeof(*ptr)); /* メモリ領域を動的確保 */...free(ptr);/* ptr は解放済みの領域をまだ指したまま */*ptr = 0; /* 何が起きるかわからない! */ このようなコードは予測不能の振る舞いをする。メモリが解放された後でシステムがその領域を他の用途に転用しているかもしれない。従って解放済みメモリ領域へのポインタ(ダングリングポインタ; dangling pointer)を使った書き込みはプログラム内の別のデータを不正に書き換えてしまう。どういうデータを書き換えたかによって、その後のプログラムの動作も異なる。単なるデータ破壊で済むかもしれないし、クラッシュするかもしれない。特に破壊的なバグとしては、同じポインタを2回free関数に渡してしまうことであり、これを「二重解放; double free」と呼ぶ。これを防ぐため、解放した後でポインタ変数にNULLを格納することがある。ポインタ変数が無効な領域を指しているかどうかを後で調べるとき、NULLが格納されているかどうかで簡単に判定できるようになる。また、free(NULL)は何もしないことが規格で保証されているので、NULLを代入しておけば(free関数を再度呼んだとしても)二重解放の危険はない。この技法は寿命の長いグローバル変数でポインタを定義する場合は必須だが、寿命の短いローカル変数でポインタを定義する場合でもフールプルーフのために用いることができる。 int *ptr = malloc(sizeof(*ptr));...free(ptr);ptr = NULL;
※この「解放後の使用」の解説は、「malloc」の解説の一部です。
「解放後の使用」を含む「malloc」の記事については、「malloc」の概要を参照ください。
- 解放後の使用のページへのリンク