TL;DR
解放済みのメモリなど、有効なオブジェクトを指していないポインタ(ダングリングポインタ)や参照。参照先を使うと未定義動作になる。
なぜ必要か
Wikipedia によると、解放されたメモリが再利用されると、ポインタの参照先には別のデータが入っている可能性があり、予測できない動作が起こる。解放後のポインタを使うことは Use After Free と呼ばれ、情報漏洩や権限昇格につながる脆弱性になる。
仕組み
ダングリングポインタは、オブジェクトを破棄したときに生じる。C 言語では、メモリを解放しても、関数から戻っても、ポインタの値は変わらない。関数内のローカル変数のアドレスを返すのも典型的な原因である。
例
Rust では、言語の機能を意図的に無効にしない限り、ダングリングはコンパイル時にエラーになる。Effective Rust 項目15 によると、有効な参照がある間は、所有者はアイテムをムーブもドロップもできない。参照を使い終わってからムーブすれば、この制約を回避できる。一方、Rust と C の FFI では、ダングリングが起きうる。
注意点
対策には、解放後にポインタを NULL に戻す、C++ のスマートポインタで参照カウントを使う、ガベージコレクションで到達できないオブジェクトだけを破棄する、などがある。ただし NULL に戻す方法は、ポインタのコピーには効かない。Valgrind や AddressSanitizer で、ダングリングポインタの使用を検出できる。