和new运算符不一样,delete运算符不能重载。在构造对象的时候,我们可以有多种分配内存的方式(通过new运算符的重载实现)和多种初始化内存的方式(通过重载构造函数实现),但当对象要销毁的时候,只存在唯一的选择: delete p;
这样做的理由是,在构造对象的那一点,在原则上你知道所有东西,而当到了删除它的时候你剩下的不过是一个指针,这个指针正好也可以是不是这个对象的类型。
当用户通过基类的指针去删除一个派生类的对象时,为了使析构函数能够正确的释放掉内存,我们需要定义一个虚的析构函数。
数组的释放:
数组的释放:
C++从C那里继承了一个问题:
指针可以指向个别对象,也可以指向一个数组的初始元素。当指针指向了一个元素的初始元素时,我们常称它指向了这个数组,而数组的分配和释放都是通过这种指针进行的。例如:
void f(X *p1) //p1 may point to a individual object or to an array
{
x *p2 = new X[100]; //p2 points to the array
//...
}
为了释放数组空间,C++提供了delete[]运算符。
delete[]的某个中间版本曾要求程序员明确的指出数组的元素个数,例如:delete[10] p2;
这种方式很容易引进错误。因为在后来的版本中,维护数组元素个数的负担转到语言的的实现方面,就是说这变成了C++的语言实现者的事,
而不是用C++的程序员的事。