NULL ポインターでのクラス メンバーへのアクセス: 非仮想メソッドの動作の調査
質問:
NULL ポインターで非仮想メソッド呼び出しが成功するのはなぜですかC 、仮想メソッドの呼び出しによりプログラムがクラッシュしますか?
答え:
非仮想メソッドの動作:
の場合非仮想メソッドが NULL ポインターで呼び出される場合、コンパイラーは、メソッドの実装。これは、非表示の「this」パラメータを関数に渡すことによって実現されます。NULL ポインタの場合、このパラメータはどこも指しません。ただし、メソッド自体はオブジェクトのメンバーにアクセスしようとしないため、コードは NULL ポインターの逆参照を回避し、意図したとおりに動作します。
正式な定義:
ただし、 C では、 NULL ポインターでのメソッドの呼び出しは正式には未定義の動作とみなされていることに注意することが重要です。これは、コンパイラーが、プログラムが見かけ上正しく実行されることを許可するなど、何が起こるかについて任意の選択を行うことができることを意味します。
仮想メソッドの動作:
仮想メソッド呼び出しには vtable が必要ですlookup を使用して、どの実装を呼び出すかを決定します。 vtable は実際のオブジェクトに関連付けられているため、vtable が関連付けられていない NULL ポインターで仮想メソッドを呼び出すとクラッシュが発生します。
オブジェクト割り当て:
提供されたコード内の変数「foo」は、メイン関数のスタックに割り当てられたローカル変数です。ただし、これは NULL ポインターで初期化され、Foo 型の有効なオブジェクトを指していないことを示します。
以上がC では仮想メソッド呼び出しが失敗するのに、NULL ポインターでの非仮想メソッド呼び出しは成功するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。