考虑代码:
class A {
public:
virtual ~A() {}
};
class B : public A {
public:
~B() {}
};
void main ()
{
A * array = new A[100];
delete array;
}
在 Windows (MSVC 2010) 上,它会导致异常,因为delete
调用HeapValidate
,这表明堆已损坏。这是如何以及为什么会发生的?
我确实意识到delete[]
应该在这里调用,当然这样就没有问题了。但是为什么会delete
导致堆损坏呢?据我所知,它应该为第一个对象(array[0]
或*array
)调用析构函数,然后释放整个块。现实中会发生什么?
注意:如果类A
只有默认析构函数,即我根本没有声明它的析构函数,则不会发生异常。不管析构函数是否是虚拟的。在调试和发布版本中。
PS是的,我知道这是未定义的行为。