C++03 標準の の下に次のスニペットが見つかりました5.3.5 [expr.delete] p3
。
最初の選択肢 (オブジェクトの削除) では、削除するオブジェクトの静的型がその動的型と異なる場合、静的型はオペランドの動的型の基本クラスであり、静的型は仮想デストラクタまたは動作は未定義です。2 番目の選択肢 ( delete array ) では、削除するオブジェクトの動的な型がその静的な型と異なる場合、動作は未定義です。
静的型と動的型のクイック レビュー:
struct B{ virtual ~B(){} };
struct D : B{};
B* p = new D();
の静的タイプはp
ですがB*
、動的タイプ*p
はD
,1.3.7 [defns.dynamic.type]
です。
[例:
p
静的型が「へのポインタ」であるポインタが、から派生しclass B
た のオブジェクトを指している場合、式の動的型は「<コード>D」です。]class D
B
*p
virtual
さて、上部の引用をもう一度見てみると、デストラクタの存在に関係なく、次のコードが正しく行われた場合、未定義の動作が呼び出されることを意味します。
struct B{ virtual ~B(){} };
struct D : B{};
B* p = new D[20];
delete [] p; // undefined behaviour here
どういうわけか、標準の文言を誤解しましたか? 私は何かを見落としましたか?標準がこれを未定義の動作として指定するのはなぜですか?