1.new_handler
new_handler
是在new失败后的处理方式,该处理方式由程序员自定义。
new_handler
是一个函数指针:typedef void (*new_handler)();
.通过set_new_handler
可以设置在new失败后调用哪个new_handler
。
2.set_new_handler
set_new_handler
用来设置当动态内存分配失败时使用哪个new_handler
。
如果没有设置new_handler
,即在第一次调用set_new_handler
之前,或者在调用set_new_handler
时传入的指针是一个空指针,则动态内存分配失败时会默认抛出bad_alloc
异常。
new_handler
需要做的事情为:
- 1.尝试使得更多的内存变为空闲的,以便下次调用malloc的时候可以成功。
- 2.抛出
bad_alloc
异常或者直接使用abort()
exit()
终止程序。
// new_handler example
#include <iostream> // std::cout
#include <cstdlib> // std::exit
#include <new> // std::set_new_handler
void no_memory () {
std::cout << "Failed to allocate memory!\n";
std::exit (1);
}
int main () {
std::set_new_handler(no_memory);
std::cout << "Attempting to allocate 1 GiB...";
char* p = new char [1024*1024*1024];
std::cout << "Ok\n";
delete[] p;
return 0;
}
3.get_new_handler
- 如果没有使用
set_new_handler
设置过new_handler
,则返回一个空指针。 - 否则返回上次调用
set_new_handler
设置的new_handler
。