コードが次のことを行うとします。
T *pointer = new T();
delete static_cast<void*>(pointer);
結果は何ですか?未定義、メモリリーク、メモリが削除されていますか?
コードが次のことを行うとします。
T *pointer = new T();
delete static_cast<void*>(pointer);
結果は何ですか?未定義、メモリリーク、メモリが削除されていますか?
動作は未定義です。削除式に関して、C++ 標準は次のように述べています。
最初の選択肢 (オブジェクトの削除) では、オペランドの静的型がその動的型と異なる場合、静的型はオペランドの動的型の基本クラスであり、静的型は仮想デストラクタを持つか、動作が未定義です。 . 2 番目の選択肢 ( delete array ) では、削除するオブジェクトの動的な型がその静的な型と異なる場合、動作は未定義です。(§5.3.5/3)
次に、この段落の脚注には次のように明確に記載されています。
これは、型
void*
のオブジェクトがないため、型のポインターを使用してオブジェクトを削除できないことを意味しますvoid
(注 73)。
void ポインターを介した削除は、明示的に別の種類のポインターに変換することを除いて、void ポインターを介して他のことを行う場合と同様に未定義です。