对于operator new操作符有一个容易被忽略的特性:
operator new成员函数会被derived class继承!
定制operator new的一个常见理由就是为了针对所在class的对象分配行为提供最优化,而不是为了其derived class。
下面先讲解下CBase *base = new CBase();的都执行了哪些接口:
step1:
如果定制了CBase::operator new,则调用CBase::operator new
如果没有定制CBase::operator new,则调用系统提供的::operator new
调用形式为:
void* buf = operator new( sizeof(CBase) )
buf用来存储CBase对象
step2:
调用构造函数CBase()在step1申请的buf堆空间上创建CBase对象初始化buf内存。
step3:如果delete base
如果定制了CBase::operator delete,则调用CBase::operator delete
如果没有定制CBase::operator delete,则调用系统标准操作符::operator new
调用形式为:
operator delete( buf ); //buf时step1申请的为了保存CBase对象的堆内存buf
由上可知,如果CBase定制了operator new,权限为public或protected可以被CDerived类继承。
则下面讲解下CDerived *derived = new CDerived();都执行了哪些接口
step1: