首页 C++内存管理- 16
文章
取消

C++内存管理- 16

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”,传递nullset_new_handler即可;

  • 抛出bad_alloc(或它的子类)异常;

  • 不返回,可以abort或者exit

关于abort, exit, terminate的区别:abort会设置程序非正常退出,exit会设置程序正常退出,当存在未处理异常时C++会调用terminate, 它会回调由std::set_terminate设置的处理函数,默认会调用abort

QQ截图20220604101541

本文由作者按照 CC BY 4.0 进行授权