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