コードを考えてみましょう:
class A {
public:
virtual ~A() {}
};
class B : public A {
public:
~B() {}
};
void main ()
{
A * array = new A[100];
delete array;
}
delete
Windows(MSVC 2010)では、呼び出しが原因で例外が発生HeapValidate
し、ヒープが破損していることを示します。これはどのように、そしてなぜ起こるのですか?
確かにdelete[]
ここで呼ばれるべきだと思いますが、もちろん問題ありません。しかし、なぜdelete
ヒープの破損を引き起こすのでしょうか。私の知る限り、最初のオブジェクト(array[0]
または*array
)のデストラクタを呼び出してから、ブロック全体を解放する必要があります。実際にはどうなりますか?
注:クラスA
にデフォルトのデストラクタしかない場合、つまりデストラクタをまったく宣言しない場合、例外は発生しません。デストラクタが仮想であるかどうかに関係なく。デバッグビルドとリリースビルドの両方。
PSはい、これは未定義の動作であることを私は知っています。