条款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版本。