241 字
1 分钟
C++内存管理- 16

C++内存管理 - 16#

此笔记需要等待更新和确认。#

New Handler#

当使用new申请内存失败时会抛出"bad alloc"异常,此前会调用一个由std::set_new_handler()指定的错误处理函数(“new-handler”)。

如下是一个最简单的形式

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。

QQ截图20220604101541

C++内存管理- 16
https://sterben-01.github.io/posts/memory6/
作者
Sterben_01
发布于
2022-06-04
许可协议
CC BY-NC-SA 4.0