class Object
{
private:
int Value;
public:
Object(int value = 0) :Value(value)
{
cout << "construct object" << this << endl;
};
~Object()
{
cout << "desconstruct oobject" << this << endl;
}
};
int main()
{
Object *p = new Object(10);
//new申请空间,然后构建对象
Object *s = new Object[10];
delete p;
//delete[] p;//error
p = NULL;
delete[] s;
//delete s;//error
s = NULL;
return 0;
}
Object *s = new Object[10];
delete[]时,先访问C,获取对象个数,再调用析构函数。
然后(底层free)再访问A,归还空间,将空间标记为未用。
如果以delete s的话,向上读取头部信息时,由于存放创建的对象个数的C空间,导致读取头部信息位置错四个字节,读取错误。
Object *p = new Object(10);
delete p 时,因为就创建一个对象,直接调用析构对象,访问A释放空间,标记为未用。
如果此时用delete[]释放的话,会访问B获得创建的对象的个数,由于B里面是随机值,所以会以错误次数来调用析构函数。