私は C++ を学んでおり、C++ Primer を読んでいます。答えを知りたい質問があります:
ポインタpが与えられた場合、 pが有効なオブジェクトを指しているかどうかを判断できますか? もしそうなら、どのように?そうでない場合、なぜですか?
いいえ、できません。なんで?有効なポインターを構成するものとそうでないものに関するメタデータを維持するのは費用がかかるため、C++ では、不要なものにお金を払う必要はありません。
また、ポインターが有効かどうかを確認する必要はありません。これは、ポインターがどこから来るかを知っているためです。これは、制御するコードのプライベートな部分であるか、外部向けのコントラクトで指定したためです。
ありえない。このシナリオを考えてみてください。
int *ptr = new int(10);
int *ptrDup = ptr;
delete ptr;
しかし、存在しなくなっptrDup
たメモリの場所をまだ指しています。ptr
したがって、逆参照ptrDup
は未定義の動作をもたらします。しかし、まったく異なる概念である参照カウントがあります。
ポインターが に設定されている場合、nullptr
それは指すオブジェクトが与えられておらず、代わりに「デフォルト」値が与えられていることを意味します。ポインターを有効なオブジェクトに割り当てることができずnullptr
、同時に有効なオブジェクトに割り当てられない可能性もありますが、その場合、それを判断することは不可能です。例えば:
とnullptr
:
int *ptr = nullptr;
// check if pointer is unassigned to an object
if (ptr == nullptr) ptr = new int{0};
なしnullptr
:
int *ptr;
// using ptr while uninitialized is Undefined Behavior!
if (ptr != &some_object)