Null ポインターを介してクラス メンバーにアクセスすると、通常、クラッシュが発生します。ただし、C では、特定の非仮想メソッドは null ポインターでも動作するようです。この動作により、いくつかの疑問が生じます。これはどのようにして発生し、オブジェクトはどこに割り当てられるのでしょうか?
C では、非仮想メソッドが null で呼び出される場合ポインターを使用すると、コンパイラーはそのメソッドに関連付けられた関数への直接呼び出しを生成します。これは、隠しパラメータ (オブジェクトへのポインタ) を関数に渡すことによって行われます。
提供された例では:
class Foo { void say_hi(); }; Foo* foo = nullptr; foo->say_hi();
コンパイラはこれを次のように変換します:
void Foo_say_hi(Foo* this); Foo_say_hi(foo);
say_hi メソッドはオブジェクトのメンバーを決して参照しないため、null ポインターを逆参照せず、したがって、 error.
正式には、null ポインターでメソッドを呼び出すことは未定義の動作です。ただし、コンパイラは、オブジェクトが null ではないと想定してコードを最適化する場合があります。これは予期しない動作を引き起こす可能性があるため危険です。
この例の場合、コンパイラはクラッシュを回避するために非仮想メソッド呼び出しを最適化します。ただし、この動作は保証されていないことに注意することが重要です。 null ポインターで非仮想メソッドを呼び出すことは、不特定の結果を招く可能性があるため、引き続き避けてください。
例の foo ポインターによって参照されるオブジェクトは、メイン機能。 Foo* 型のローカル変数がスタック上に作成され、それに割り当てられる値は null ポインタになります。これは、オブジェクト自体がメモリのどこにも存在しないことを意味します。
以上がNull ポインターでの非仮想メソッド呼び出しが C でクラッシュを回避する場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。