たとえば、Linuxでは、task_structを指すポインターがあります。後で、task_structが移行または削除される可能性があります。ポインタがまだtask_structを指しているかどうかを知るにはどうすればよいですか?
4 に答える
不可能です。
ポインタにはアドレスのみが含まれており、通常、特定のアドレスが「有効」であるかどうかを判断することはできません。
ポインタを提供したエンティティに、それがまだ有効かどうかを最初に尋ねることができる場合もありますが、それはもちろんエンティティの正確な詳細によって異なります。言語自体はこれを行うことができません。
あなたは知らない、なぜなら:
- ポインタには、それが指すオブジェクトのアドレスが含まれているだけです。
- タイプ情報はコンパイル時に失われます。
したがって、Cはこの種の問題に対処するための機能を提供していません。自分で指摘したものに何が起こるかを追跡する必要があります。
あなたが尋ねることができる最も多くのこと(そしてそれはすでにOS固有です)は、構造が存在するメモリページがまだアクセス可能かどうかをチェックすることですが、通常それは特に有用な情報ではありません。
割り当てパターン/運によっては、セグメンテーション違反が発生する可能性があります(もちろん、プログラムが強制終了されます)...しかし、少なくとも、参照が無効になっていることがわかります。
ただし、前述のように、最善の方法は自分で有効性を追跡することです。
構造体をメモリ内で移動し続ける必要がある場合(単に構造体を空白にして現在の場所で再初期化するのではなく)、追跡を容易にするためにポインターへのポインターを使用することを検討できます。
「つまり、すべてが構造体へのポインタへの参照を取得し、構造体を移動または削除するときに、そのポインタをNULLまたは新しいメモリ位置に設定するだけです。」
また、一般的に、この種の奇妙さについてプログラムをチェックしたい場合は、valgrindを調べることをお勧めします。
あなたがそれを追跡するようにあなたのコードを書くことはCでのあなたの責任です。NULLの特別な値(何も指していないことを表す)を使用して、ポインターが指しているものを削除する(またはまだ設定していない)ときにポインターをNULLに設定し、使用する前にNULLをテストできます。また、質問が出ないようにコードを設計することもできます。
ランダムポインタ値をクエリして、それが何かを表しているかどうかを確認する方法はありません。int変数をクエリして、その値が初期化されていないか、ジャンクであるか、または計算の正しい結果であるかを確認する方法がないのと同じです。
それはすべてソフトウェア設計の問題であり、必要に応じて、NULLの値を使用して未設定を指定します。