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

你可能感兴趣的:(C++,读书笔记,effective)