Effective C++读书笔记 第八部分 定制new和delete

条款49: 了解new-handler 的行为

(1) set_new_handler 允许客户指定一个函数,在内存分配无法获得满足时被调用。

(2) No-throw new 是一个颇为局限的工具,因为它只适用于内存分配;后继的构造函数调用还是可能抛出bad_alloc异常。

条款50: 了解new 和delete 的合理替换时机

有许多理由需要写个自定的口new 和delete ,包括改善效能、对heap 运用错误进

行调试、收集heap 使用信息。

条款51: 编写new和delete时需固守常规

operator new内应该有一个无穷循环,并在其中尝试分配内存,如果分配失败,就调用new handler。它也应该有能力处理0 bytes申请(对于标准库中的new操作符,当用户申请0bytes,会返回1bytes的空间)。class版本还需要处理“比正确大小更大的(错误)申请”。

需要注意的是,operator new成员函数会被derived classes继承,也就是说, base class的operator new可能被调用以分配derived class对象。因此 derived class的 operator new的代码建议:

struct Base{ 
 static void* operator new(std::size_t size) throw( std::bad_alloc ); 
 ... 
};
 
struct Derived:public Base{...}; 
Derived* p = new Derived;//call Base::operator new. 
void* Base::operator new(std::size_t size) throw(std::bad_alloc) 

  if( size != sizeof(Base) ){ 
  return ::operator new( size ); //call standard operator new version. 

... 
}

条款52: 写了placementnew 也要写placement delete

1. 当你写一个placement new,请确定也写出对应的placement delete。如果没这样做,你的程序可能会出现微弱时断时续的内存泄漏;
2. 当你写placement new和placement delete时,请确定不要无意识的(非故意的)遮掩了全局范围默认的new/delete版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值