ポインタ (プログラミング)
コンピュータのメモリ空間(memory space)は番地(アドレス)と呼ばれる通し番号で管理される。コンピュータがプログラムを実行する際は、プログラムに含まれる変数や定数、オブジェクトの実体(インスタンス)、サブルーチンなどはそれぞれのデータ型および命令数などに基づいたサイズを持ち、何らかのアドレス値をもってメモリ空間上に配置される。このアドレス値を格納するための変数がポインタである。
(アセンブリ言語のような低水準言語ではない)高水準言語において、数値型(例えばCにおけるint型やdouble型)のような、ポインタではない型の変数は、そこに整数や小数といった値を格納するための入れ物であり、その配置場所がメモリ上のどのアドレス(番地)であるかは、取り立てて必要のない限りは意識しなくて済む仕様となっている。一方、この配置場所を値として格納するための変数がポインタである。
厳密にいうと、ポインタではない型の変数の場合も、変数自身が内部的に持つのは整数や小数の値そのものではなくその配置場所のアドレスである。ただしこのアドレス参照は高水準言語のプログラムコード上では隠蔽される。一方のポインタ変数では、値の配置場所のアドレスが格納されていることが高水準言語のコード上でも現れる。
ダングリングポインタ(英語版)(英: dangling pointer)は解放後のメモリ領域を参照するポインタである。
メモリ領域は変数のために確保され利用後に解放される。ゆえにその領域が正しい意味を持つのは確保から解放までの間のみであり、解放後にその領域へアクセスすること (Use-After-Free) は未定義の動作を引き起こす。ダングリングポインタは解放後のメモリ領域を参照しているため、このポインタの利用は Use-After-Free であり予測できない結果を生み出してしまう。
防止策が無い場合、ダングリングポインタは容易に生成されうる。例えば、参照を生成し元の変数を free するだけで参照先が解放された状態になってしまう(参照先と参照での生存期間ズレ)。可変長配列のスライス参照ではより複雑で、配列へのpushに伴うメモリ再割り当てで変数の生存期間中なのに最初の領域が解放されるケースがある。
このためダングリングポインタはバグの大きな原因であり、それを悪用したハッキングにしばしば利用される。これを事前に防ぐためにモダンなプログラミング言語では言語仕様レベルでのダングリングポインタ防止策が取り入れられている(例: Rust の借用チェッカー)。