先頭へ戻る

ダングリングポインタ | Programming Place Plus 用語集

Programming Place Plus トップページ用語集

先頭へ戻る

名称

解説

メモリ領域の無効な場所を指し示しているポインタのことです。

たとえば、ダイナミックメモリアロケーションによって確保されたメモリ領域を指すポインタ変数があるとして、メモリ領域を解放したあとで、そのポインタ変数をそのままにしていると、ダングリングポインタになります。ダングリングポインタが指し示す先は無効な状態ですから、ダングリングポインタを間接参照して、メモリ領域を読み書きすることは危険な行為です。

以下は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 でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー