C++内存管理 - 16
此笔记需要等待更新和确认。
New Handler
当使用new
申请内存失败时会抛出"bad alloc"
异常,此前会调用一个由std::set_new_handler()
指定的错误处理函数(”new-handler”)。
如下是一个最简单的形式
1
2
3
4
5
6
7
8
void outOfMem(){
std::cout<<"Unable to alloc memory";
std::abort();
}
int main(){
std::set_new_handler(outOfMem);
int *p = new int[100000000L];
}
当new
申请不到足够的内存时,它会不断地调用outOfMem
。因此一个良好设计的系统中outOfMem
函数应该做如下几件事情之一:
使更多内存可用;
安装一个新的”new-handler”;
卸载当前”new-handler”,传递
null
给set_new_handler
即可;抛出
bad_alloc
(或它的子类)异常;不返回,可以
abort
或者exit
。
关于abort
, exit
, terminate
的区别:abort
会设置程序非正常退出,exit
会设置程序正常退出,当存在未处理异常时C++会调用terminate
, 它会回调由std::set_terminate
设置的处理函数,默认会调用abort
。