たとえば、ダイナミックメモリアロケーションによって確保されたメモリ領域を指すポインタ変数があるとして、メモリ領域を解放したあとで、そのポインタ変数をそのままにしていると、ダングリングポインタになります。ダングリングポインタが指し示す先は無効な状態ですから、ダングリングポインタを間接参照することは危険な行為です。
以下はC言語での例です。
int* p = malloc(sizeof(int));
// ...
free(p); // 解放が行われ、p はダングリングポインタになる
printf("%d\n", *p); // 危険C言語や C++ では、free関数が解放したメモリ領域(オブジェクト)は生存期間(割付け記憶域期間)を終えたことになります。生存期間が終了しているオブジェクトを間接参照することは未定義の動作とされています。[1]
この危険性を回避するために、解放を行った直後に、ポインタ変数にヌルポインタを代入しておく手法がよく使われます。ヌルポインタを間接参照することも危険ですが、ヌルポインタであることをチェックすれば回避できます。
int* p = malloc(sizeof(int));
// ...
free(p); // 解放が行われ、p はダングリングポインタになる
p = NULL; // p はダングリングポインタではなくなった
if (p != NULL) { // p は NULL なので、ブロック内には侵入しない
printf("%d\n", *p);
}C言語や C++ では、ヌルポインタを間接参照することも未定義の動作です。[1]
また、次のような例も同様で、ポインタ変数が指し示していた先の変数が生存期間を終えるため、ダングリングポインタになります。
void f(void)
{
int* p = NULL;
{
int v = 100;
p = &v; // 有効な場所を指す
// ...
} // v が生存期間を終えるため、p はダングリングポインタになる
printf("%d\n", *p); // 危険
}
ダングリングポインタによく似た用語に、ワイルドポインタがあります。これは、ポインタ変数が初期化されていないときや、間違ったアドレス計算を行ったなどして、メモリ上の不正な場所を指しているポインタのことです。
Programming Place Plus のトップページへ
| はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
| X で ポスト/フォロー | LINE で送る | noteで書く |
|
|
管理者情報 | プライバシーポリシー |