5

コードが次のことを行うとします。

T *pointer = new T();
delete static_cast<void*>(pointer);

結果は何ですか?未定義、メモリリーク、メモリが削除されていますか?

4

2 に答える 2

8

動作は未定義です。削除式に関して、C++ 標準は次のように述べています。

最初の選択肢 (オブジェクトの削除) では、オペランドの静的型がその動的型と異なる場合、静的型はオペランドの動的型の基本クラスであり、静的型は仮想デストラクタを持つか、動作が未定義です。 . 2 番目の選択肢 ( delete array ) では、削除するオブジェクトの動的な型がその静的な型と異なる場合、動作は未定義です。(§5.3.5/3)

次に、この段落の脚注には次のように明確に記載されています。

これは、型void*のオブジェクトがないため、型のポインターを使用してオブジェクトを削除できないことを意味しますvoid(注 73)。

于 2010-04-25T18:08:25.843 に答える
1

void ポインターを介した削除は、明示的に別の種類のポインターに変換することを除いて、void ポインターを介して他のことを行う場合と同様に未定義です。

于 2010-04-25T18:10:21.833 に答える