条款49 了解new-handler的行为

  • operator new抛出异常反映一个未获满足的内存需求之前,他会调用客户指定的错误处理函数(new-handler)。用户必须调用 set_new_handler (声明于)

image.png

该处理函数的参数是个指针,指向operator new无法分配足够内存时该被调用的函数

  1. void outOfMem(){
  2. std::cerr<<"Unable to satisfy request for memory\n";
  3. std::abort();
  4. }
  5. int main(){
  6. std::set_new_handler(outOfMem);
  7. int *pBigDataArray = new int [10000000L];
  8. }

看晕了,缓一缓再说…

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

  • C++要求所有的operator new返回的指针都有适当的对齐。

operator new返回一个得自 malloc 的指针是安全的。

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

operator new的返回值非常单纯,如果能提供客户申请的内存,就返回一个指针指向那块内存;如果不能,就调用处理函数并抛出 bad_alloc 异常。

  • operator new实际上不止一次尝试分配内存,并在每次失败后调用处理函数。

如果 base classes 遗漏 virtual 析构函数,operator delete可能无法正确运行,因为传给operator delete 的size_t可能不正确

条款52 写了placement new 也要写placement delete

  1. void* operator new(std::size_t, void* pMemory) throw();

这个new的用途之一是在已申请、开辟但未使用空间上创建对象


编译器在调用new之后会调用operator new和构造函数,如果operator new没有抛出异常,而在构造函数抛出异常,那么就要取消operator new的分配并调用与之对应的operator delete清理内存。运行期系统寻找参数个数和类型都与operator new相同的operator delete

image.png


image.pngimage.png


默认情况下C++在global作用域内提供以下形式的operator new

image.png

编写class的时候可以让成员函数调用他们。