これらのエラーと実行時またはコンパイル後の結果との意味の違いをよりよく理解するために、これをコミュニティ wiki にしています。また、私は Java でのコーディングが長すぎたので、C++ でポインターをよりよく学びたいと考えています。
Edit2:この質問をリファクタリングしています。私が描こうとしている違いは、マネージ コードでは、これらのエラーはすべて例外を介して一様に処理されるということです。ただし、C++ はそれほど単純ではありません。それぞれのケースで、エラー、セグメンテーション違反、回復可能な動作、さらに悪いことに伝播するサイレントエラーが発生する可能性があるかどうかを理解したいと思います。私の新しい具体的な例を見てください (そして、はい、答えは常に「コーディングされているとおりに」であることを知っています。結局のところ、私はプログラマーです。あなたがよく遭遇することの興味深い詳細を知りたいです。)
Edit3:以下では、「クラス」とは、代わりにクラスのインスタンスを意味します。ありがとう
エラー 1: ポインター値が NULL、別名ポインター == 0 です
- マネージ コード: 実行時に NullPointerException をスローします。
- C++: ?
- 例:クラスへのポインタがありますが、0 に初期化されています。関数に渡すとどうなりますか。すなわち。C++ はクラスの表示を一切残しません。これは、パブリックな「プレースホルダー」を連結したものにすぎません。
エラー 2: ポインターは、値が NULL または == 0 であるメモリ内の以前のクラスを指しています
- マネージ コード: メモリ モデルでは許可されていません。参照されたすべてのオブジェクトはメモリに残ります。例外的なケースはありませんか?
- C++: ?
- 例:クラスへのポインタがあり、そのクラスが削除されました。次に、ポインターを引数として関数に渡します。明らかに、発生する問題は、関数がポイント先のクラスをどのように処理するかによって異なります。私の質問は: STL でこれに対するフェイルセーフ処理はありますか? 優れたプロプライエタリ ライブラリ? 平均的なオープン ソース コードは?
エラー 3: ポインタが正しいクラスまたはサブクラスではないクラスを指しています
- マネージ コード: ClassCastException をスローします。
- C++: [間違っていれば訂正] コンパイラは、不正なキャストを許可しないことでこれと戦おうとします。ただし、これが実行時に発生する場合は、未定義の動作が想定されます。これが常に爆発するとは限らない同様のクラスオブジェクトのケースはありますか?
- 例: ポインターが誤って再割り当てされ、その値が別のクラスと完全に等しくなります。この参照されたクラスを渡す関数は、参照するインスタンス変数のオフセットをやみくもに取得すると仮定します。したがって、生のバイナリを間違って解釈します。C++ でこれを防ぐ方法はありませんか? および/または... この能力が永久に悪用される場合はありますか?
エラー 4: ポインターがクラスの中間 (位置合わせされていない) または初期化されていないガベージを指している
- マネージ コード: メモリ モデルでは許可されていません。
- C++: ケース 3 に相当しますか?
- 例: 多くの場合、実際にこれを合法的に使用します。たとえば、STL ベクトルの配列に直接アクセスできます。これは、クラスの中央を指しています。しかし、それは「見逃す」のと同じくらい簡単に思えますか?リンク先のライブラリとは異なるライブラリがロードされた場合など、意図に反してこれが発生する可能性がある一般的な落とし穴はありますか (それを防ぐメカニズムはありますか?)
すべての貢献者に事前に感謝します。