:: deleteに渡された左辺値を変更する最初のコンパイラーに遭遇しましたが、左辺値をゼロにしません。それは次のとおりです。
Foo * p = new Foo();
Foo * q = p;
assert(p != 0);
assert(p == q);
::delete p;
assert(p != q);
assert(p != 0);
削除操作後のpはゼロではなく、古い値から変更されていることに注意してください。同僚は、pを0xFFFFFFFFに変更するメインフレームC ++コンパイラや、pを0に変更する他のコンパイラを使用した経験では、これは珍しいことではないと私に言いました。
C ++標準のどこで、コンパイラがこれを実行できると言っていますか?
StackOverflowを検索すると、次の質問が見つかりました。削除してポインタをNULLに設定しないのはなぜですか。これには、次のステートメントを含むBjarneStroustrupの応答を参照する回答がありました。
C ++では、削除の実装で左辺値のオペランドをゼロにすることが明示的に許可されており、実装でそれができることを期待していましたが、そのアイデアは実装者に普及していないようです。
最終委員会ドラフトC++0x標準のセクション5.3.5および12.5を読み直しましたが、「明示的な」部分が表示されていません。標準の間違ったセクションを見ているだけですか?または、セクションにロジックのチェーンがありますが、正しく接続されていません。
AnnotatedC++リファレンスマニュアルのコピーはもうありません。コンパイラがこれを実行できるのはARMでしたか?
[編集:セクション参照を3.5.3から5.3.5に修正。また、削除後にpが未定義であるというヘンクの主張に対する対位法として、興味深いパラドックスを追加しています。]
pがnullに初期化される場合、興味深いパラドックスがあります。
Foo * p = 0;
Foo * q = p;
assert(p == 0);
assert(p == q);
::delete p;
assert(p == q);
assert(p == 0);
ただし、この場合、動作は十分に文書化されています。deleteがnullポインターを取得すると、何もしないと想定されるため、pは変更されません。