#include<iostream>
using namespace std;
class base{
public:
virtual ~base(){}
};
class derived:public base{
int a;
};
int main(){
base *p=new derived[10];
delete[] p;
return 0;
}
c++ 03 5.3.5
In the first alternative (delete object), if the static type of the object to be deleted is different from its dynamic type, the static type shall be a base class of the operand’s dynamic type and the static type shall have a virtual destructor or the behavior is undefined. In the second alternative (delete array) if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.
在某些实现里,base4个字节,derived8个字节,你new了一个80个字节的derived*数组然后当base*干掉,那么要么它就会执行析构函数20次然而有10个this指针式不对的,要么他会执行10次然而有5个this指针是不对的。自然要挂。
然而在VC++下面却没问题,因为VC++的实现是记录了array的个数和每个对象的大小,他不会因为你把数组搞成了base*就真的以为他是base[],所以会执行10次析构函数,10次的this指针都对。
为什么错误的this指针就会挂呢?因为从base调用derived::~derived函数的方法,是先把一个固定的数字加到this指针上面得到一个全局的代表derived在base上面的虚函数表,然后再虚函数表里面找到析构函数的指针,最后执行它。如果你的this有问题,那中间有一步就会dereference失败,自然AV。