B* pb = new D[3]; B为父类,D为子类
delete []pb;
其实这个问题的原理很简单,delete就是释放堆上对象,它删除一个对象的时候,从指针pb开始,到sizeof(B)结束,记住,这时候是sizeof(B),调用B的析构函数,B的析构函数是虚函数,根据多态性,就先调用D的析构函数,再调用B的析构函数。
删除1个对象或者数组的第1个对象都没有问题,但删除第2个对象就麻烦了,delete第2个对象,就是从2*sizeof(B)开始删除,但是sizeof(B) != sizeof(D),于是截断D对象,结果不能正确调用析构函数,发生错误。