【Effective C++】读书笔记 条款49~51

定制new和delete

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

1. 了解new-handler

当operator new无法满足某一内存分配需求时,它会先调用一个客户指定的错误处理函数,(默认情况下这个错误处理函数是空,operator new会直接抛出异常)。为了指定这个”用以处理内存不足”的函数,客户必须调用set_new_handler,那是声明于的一个标准库函数,他将执行一个new-handler类型的函数指针。如下:

namespace std{
    typedef void (*new_handler)();
    new_handler set_new_handler(new_handler p) throw();
}

new_handler是一个typedef,它的类型是参数和返回值都为void的函数的函数指针,set_new_\handler的new_handler型参数用于指定当无法分配足够内存时调用的函数,set_new_handler返回的函数指针指向在此之前用处理内存不足当马上就要被替换的函数。

new_handler的具体用法如下:

//下面是无法分配足够内存时,应该被调用的函数
void outOfMem(){
    std::cerr<<"Unable to satisfy  request for mempry/n"<std::abort();
}
int main(){
    std::set_new_handler(outOfMem);
    int* pBigDataArray=new int[1000000000];
    ...
}

如果operator new无法分配1000000000个int变量所需空间,它不会立即抛出异常,而是调用outOfMem,因为outOfMem已经被设置为默认的new-handler。并且在以后发生异常后,同样也会调用这个outofMem,因为原本的内存处理函数已经不在了。

一个new-handler的主要作用

  1. 让更多内存可被使用,然后下一次调用new的时候有可能就会调用成功。
  2. 安装另一个new-handler,如果当前new-handler无法获取更多内存但它知道另一个new-handler有此能力,它可以调用set_new_handler将那个new_handler设为默认new_handler使得下一次operator new调用的new-handler是最新的那个。
  3. 卸除new-handler.将NULL指针传给set_new_handler,如果没有安装任何new-handler,当operator new分配内存不成功时抛出异常。
  4. 抛出bad_alloc(或派生自bad_alloc的)异常.这样的异常不会被operator new捕捉,因而会被传递到内存索求处.
  5. 不返回。调用abort或exit。

2. 设计class专属的new-handlers

当我们调用set_new_handler时候,设置的是全局内存错误处理函数。C++自身也不支持class专属的new-handlers。但是我们可以实现如

你可能感兴趣的:(读书笔记,effective-c++,c++,内存分配,new,delete)