[ C++ ] set_new_handler解析
2024-10-09 07:07:42
当 operator new 中malloc返回值为0(NULL)时,表示分配内存失败(可能是因为内存不足),
此时会通过_callnewh()调用用户通过set_new_handler()设定的new_handler(),用于处理错误情况。
(一般用于回收已分配内存?)
它长成这样
namespace std{
typedef void (*new_handler){ };//一个函数指针
new_handler set_new_handler(new_handler p) throw();
};
下面是一个小栗子
#include<iostream>
using namespace std;
void out_of_memory() {
cerr << "Out of memory!!" << endl;
abort();
}
int main() {
set_new_handler(out_of_memory);
while (1) {
new int[1000];
}
}
运行后打印"Out of memory!!"。
怎样设计一个性能优良的new_handler
- 让更多的内存被使用。这样做的目的很简单,就是为了内存能够尽可能被operator new进行分配。实现此要求的做法是,当new_handler被调用的时候,将之前分配的内存释放给程序,以便能够继续使用。
- 安装新的new_handler。如果当前的new_handler无法取得更多的内存,那么这个new_handler应该能够安装新的new_handler以便能够获得更多的内存空间。
- 卸载new_handler,也就是将null指针传给set_new_handler。这样的话,一旦没有分配成功,就会抛出异常。
- 抛出bad_alloc的异常。这样的异常不会被operator_new捕捉,因此会被传播到内存索求处。
- 不返回。通常会调用abort或者exit。
最新文章
- 20161106PM-接口
- CSS3--box-shadow
- 【荐】Spring事务配置的五种方式
- 字节流、字符串、16进制字符串转换__Java(转)
- OpenJudge 取数游戏
- java web servlet
- JSONP(转)
- 浙大 pat 1024题解
- iOS-swift-基础篇1
- SQL Server——存储过程
- 检测linux vps是xen openvz还是kvm的方法
- Ubuntu 13.04设置root用户登录图形界面
- .NET之JSON序列化运用
- (Python3) 求中位数 代码
- 插头dp初探
- 简述openstack
- QCon2019全球软件开发大会广州站即将来袭
- typescritp 导出默认接口
- C# 解构
- python学习笔记Day2