【发布时间】:2013-02-11 00:14:15
【问题描述】:
考虑代码:
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只有默认析构函数,即我根本没有声明它的析构函数,则不会发生异常。不管析构函数是否是虚拟的。在调试和发布版本中。
P。 S. 是的,我知道这是未定义的行为。
【问题讨论】:
-
可能是因为
new[]的作用与new不同。
标签: c++ windows memory-management destructor