重载new 和 delete 操作符

void * operator new(size_t)

void operator delete(void *, size_t)

 

void * operator new[](size_t);

void operator delete[](void *, size_t);

 

  a: new  返回类型必须是void *

  b: 参数必须是size_t【在<cstddef>定义】,它会被编译器赋值。

 

  c: delete 返回类型必须是void

  d: 第一个参数必须是void *

  e: 第二个参数必须是size_t,[这个在对象类层次中非常基本的,如通过基类的指针来删除派生类的对象,呵呵,

     前提是析构是虚的,则首先释放空间,然后析构]

 

  f: 重载 new 和 delete, 这2个操作符会被自动处理为静态成员,无需programmer显示的把它申明为静态。

      why?
     CLASS *pCls = new CLASS();   等价于   Vois *pV = CLASS::operator new( sizeof(CLASS)); //分配memory
                                                                         CLASS::CLASS();                                                       //构造函数
                                                                          pCls = pV;                                                                 //赋值 
 
     delete pCls;                                 等价于   CLASS::~CLASS();                                                //析构函数
                                                                        CLASS::operator delete( pCls, sizeof(CLASS))   //释放memory
     可以看出,在构造函数之前调用operator new(),在对象未创建前就调用了new()操作符,静态成员有此特性
                          在析构以后调用operator delete(). 在对象析构以后,调用delete()操作符,静态成员有此特性
 

2

//定位操作符

void *operator new(size_t, class *pMem);

void operator delete(void*, class *pMem);

  a: 第二个参数为定位实参的值。

  b: 这里的delete 操作符, 不会被我们调用,汗~~~但为什么还有写此函数与此相匹配呢? 写这个的目的是

     为了给compiler隐式调用的,如:

 

   CLASS *pCls = new CLASS(); 等价于   Vois *pV = CLASS::operator new( sizeof(CLASS)); //分配memory

                                                                     CLASS::CLASS();                                                        //构造函数
                                                                      pCls = pV;                                                                   //赋值 
   当在第二步(构造函数)抛出Exception, 则compiler会调用与此匹配的delete操作符,否则会memory leak.

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值