トゥームストーンは、ダングリングポインタを検出し、コンピュータプログラムで発生する可能性のある問題を軽減するためのメカニズムです。ダングリングポインタは、C、C++、アセンブリ言語などの特定のコンピュータプログラミング言語で発生する可能性があります。
トゥームストーンは、ポインタとそのターゲット(多くの場合、メモリ内のヒープ動的データ)との間の仲介役を務める構造体です。ポインタ(ハンドルと呼ばれることもあります)はトゥームストーンのみを指し、実際のターゲットを指すことはありません。データが割り当て解除されると、トゥームストーンはnull(または、より一般的には、特定の実行環境におけるポインタとしては不正な値)に設定され、変数がもう存在しないことを示します。[ 1 ]このメカニズムにより、無効なポインタの使用が防止されます。無効なポインタを使用すると、割り当て解除された変数がかつて所有していたメモリ領域にアクセスし、その領域に既に他のデータが含まれている可能性があり、その結果、メモリ内データが破損する可能性があります。オペレーティングシステムによっては、CPU がこのような無効なアクセスを自動的に検出できます(たとえば、null 値の場合:null ポインタ逆参照エラー)。これは、実際の理由であるプログラミングエラーの分析やデバッグに役立ちます。また、本番環境でプログラムを中止して、無効なデータ構造での実行を続行するのを防ぐためにも使用できます。
より一般的な言葉で言えば、墓石は「このデータはもう存在しない」ことを示すマーカーとして理解できます。例えば、ファイルシステムでは、ファイルを削除する際に、そのデータブロックをすべてすぐに回収するのではなく、「dead(不要)」とマークする方が効率的です。[ 2 ]
トゥームストーンの使用に伴う欠点としては、計算オーバーヘッドとメモリ消費量の増加が挙げられます。ポインタからトゥームストーンを経由してデータへのパスを辿るには余分な処理が必要であり、プログラム全体を通してすべてのポインタのトゥームストーンを保持するために余分なメモリが必要になります。もう一つの問題は、対象となるポインタを扱うすべてのコードをトゥームストーン機構を使用するように実装する必要があることです。[ 3 ]
一般的なプログラミング言語の中でも、C++は標準ライブラリにおいて、std::weak_ptrを用いた弱ポインタとしてトゥームストーンパターンを実装しています。このメカニズムを使用するために、プログラミング言語やコンパイラによる組み込みサポートは必要ありません。