new delete

来源:互联网 发布:潭州淘宝旗舰店靠谱吗 编辑:程序博客网 时间:2024/05/08 01:06

我们可以通过重新定义operator new()和operator delete(),通过这种方式来接办存储管理工作,然而取代全局的

operator new()、operator delete()并不可取。这些函数可能已经有了其它版本,也可能默认行为的某些方面已经被其它行为所依赖。一种更可取的方式是为一个特定的类提供这些操作,为其本身及其子类提供特殊的分配器和释放器。

    类的void* operator new(size_t)、void operator delete(void*,size_t)默认为static成员,因此它们没有this指针,也不会修改任何对象。它们将提供一些存储,供构造函数进行初始化,而后由析构函数去处理。

析构函数最好实现为虚析构函数,这样对基类指针执行delete就可以删除该指针实际指向的对象 。sizeof(Manager)使得不用在专用分配器中

也存储这些信息。专用分配器可以存储这些信息,并忽略提供给operator delete()的size_t参数。

class Manager: public Employee

{

int lever;

};

void f()

{

Employee* p = new Manager;

delete p;

}

此时编译器无法得到正确的大小,就像删除数组一样,用户必须提供一些帮助。这些可以为Employee提供一个虚析构函数来解决。

这样就能保证每个由它派生的类提供一个析构函数,释放工作在析构函数(它知道大小)中完成。

 

在实际中这涉及到编译器的实现方式:

分配工作由(编译产生的)下述调用完成

Employee::operator new(sizeof(Manager));

而释放由(编译产生的)下述调用完成

Employee::operaotr delete(p,sizeof(Manager)):

 

构造函数不能是虚的,要构造一个函数,构造函数必须知道所创建对象的确切类型,因此构造函数不能是虚的。同时因为它是以常规函数所

没有的方式,因此你不能有一个到构造函数的指针。

原创粉丝点击