1

クラスの非静的、非仮想メソッドを null ポインターから呼び出すことはできますか? メンバー関数は、this==nullptr かどうかをテストし、true の場合はすぐに戻ります。

ほとんどの場合にうまくいくことはわかっていますが、これは保証された結果ですか? そうすれば、null ポインター例外が発生しないようにすることができ、呼び出し元コードの多くの場所で null ポインターのテストを回避できます。それはコンパクトさのためです。今はそうするつもりはありませんが、これが機能することを保証する標準があるかどうか知りたいです...

ありがとう!

4

4 に答える 4

4

a の逆参照nullptr未定義の動作です。限目!
特定の実装で動作するかどうかは関係なく、動作は保証されません。

于 2013-06-21T14:55:44.550 に答える
0

ここに興味深い回答があります: null インスタンスでメンバー関数を呼び出すと、未定義の動作が発生するのはいつですか?

また、標準では、メンバー仮想関数を呼び出すメカニズムについてのヒントはありません。これは通常、隠し関数の引数として 'this' を渡すだけで実行されます。これは、実際にはポインターを逆参照せずに機能します。ただし、vtable を使用して非仮想関数を実装することも可能であるように思われますが、この場合はクラッシュします。

興味深いことに、Microsoft 関数はこの動作に依存しています:) http://msdn.microsoft.com/en-us/library/d64ehwhz%28v=vs.80%29.aspx

于 2013-06-21T17:00:56.027 に答える
0

標準では、NULL ポインターの逆参照を未定義の動作として明示的に言及しています。演算子を使用すると、ポインターが左に逆参照されます。

したがって、実装でケースの動作が定義されている場合にのみ問題ありません。可能性があるためです(ただし、実際にはまだ遭遇したことはありません)。

(何かを観察することは定義されることと同じではないことを理解していただければ幸いです。)

于 2013-06-21T15:00:19.357 に答える
0

ヌル ポインターの呼び出しは常に避けてください。通常は、コア ダンプが発生します。

于 2013-06-21T15:04:22.647 に答える