1. 定义
std::new_handler set_new_handler( std::new_handler new_p ) throw();
将new_p设置为new_handler 函数,介绍一下std::new_handler。
typedef void (*new_handler)();
std::new_handler是函数指针类型:指针指向没有入参并且返回值为void类型的函数。用于std::set_new_handler函数和std::get_new_handler函数。
new_handler函数:当分配内存失败时,会通过默认的分配函数(new和new[])调用。如果new分配空间失败,会反复调用这个new_handler函数直到内存分配成功,或者直到new_handler函数不返回或被替换。在第一次调用new_handler函数之前,如果new_p是个空指针,默认的分配函数直接throw bad_alloc。
new-handler函数的三个功能:
1) 分配更多的内存空间
2) 中断程序;
3) throw异常类型bad_alloc
默认操作throw std::bad_alloc,用户可以生成自己的new-handler函数;
set_new_handler(0)主要是为了卸载目前的内存分配异常处理函数,一旦分配内存失败的话,C++就会强制性抛出std:bad_alloc异常。
2. 例子
#include <iostream>
#include <new>
void handler()
{
std::cout << "Memory allocation failed, terminating\n";
std::set_new_handler(nullptr);
}
int main()
{
std::set_new_handler(handler);
try {
while (true) {
new int[100000000ul];
}
} catch (const std::bad_alloc& e) {
std::cout << e.what() << '\n';
}
}
new[]时调用new_handler函数,如果分配成功直接返回,如果失败调用handler函数,如例子set_new_handler(nullptr)直接throw bad_alloc一个异常。