【49】了解new_handler的行为
1、使用operator new无法获取内存时,对于旧式编译器,会返回一个null指针。对于新式编译器,会抛出一个异常。
2、考虑下面的需求,当operator new 无法获取内存时,程序员期望获得通知,并调用一个方法。也就是说,向系统传递一个回调方法。这就是new_handler:
typedef void (* new_handler) (void); new_handler是一个指针方法,形参为空,没有返回值。
new_handler set_new_handler(new_handler p) throw ();
set_new_handler 方法就是传递一个回调方法,返回老的回调方法。
3、new_handler 的意思就是说,当使用operator new 无法分配内存时,转交给用户,用户来做一些事情。new_handler 要做下列事情:
a、提供更多内存可供使用;
b、安装另一个new_handler,调用另一个方法;
c、卸载new_handler,这时会抛出异常;
d、抛出bad_alloc异常;
e、不返回,调用abort或者exit。
4、C++并不支持class专属的new_handler。也就是说,程序员期望,对于不同的class,在堆上分配对象无法获取内存时,可以做不同的事情,但是C++不支持class专属的new_hanlder,也就是说,所有的operator new 共享new_handler,那该怎么办?
想法是:分配Widget对象之前,安装Widget的new_handler,分配成功后,卸载Widget的new_handler。
5、为了保证能够卸载成功,需要使用资源管理类,对老的new_handler管理,析构的时候,重新指向老的new_handler。
6、为了可以支持不同class,建立一个模板类,并且把set_new_handler有关的代码上移到父类,具体的类继承类模版。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理