Effective C++随笔 49 to 52 定制new和delete

本文探讨了C++中new-handler的作用与使用方法,解释了如何通过set_new_handler指定内存不足时的处理函数,以及如何重载new和delete操作符以适应特定需求。同时,文章还讨论了placement new与placement delete的概念及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

49.了解new-handler的行为

在这里插入图片描述
如上所述,当operator new想要分配内存但未获满足时,会抛出一个异常。但在此之前,会调用一个客户指定的错误处理函数,一个所谓的new-handler,为了指定这个用以处理内存不足的函数,客户必须调用set-new-handler函数,这是一个声明于头文件<new>中的一个标准库函数。
其在头文件中的定义如下:
在这里插入图片描述
在这里插入图片描述
下面给出一个如何使用它的范例:
在这里插入图片描述
若程序不能为其分配所要求的内存空间,则函数no_memory()会被调用。
一个设计良好的new-handler函数应当完成以下工作:
在这里插入图片描述
一般我们使用类对象管理它,这里给出一例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当然,我们也可以设计一个基类完成该功能,只需让那些需要自己管理内存的类继承它就好。

在这里插入图片描述
在这里插入图片描述
当然,还有另一种处理方式—旧式的nothrow形式,传统地分配失败便返回NULL,但它只适用于内存分配,后继构造函数仍然可能抛出异常。
在这里插入图片描述

50.了解new和delete的合理替换时机

我们出于以下三个目的可能会想要替换编译器自带的new与delete
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
一个定制new的实现:
在这里插入图片描述
但它有一个显著问题:未适当对齐(相对指针偏移了一个int),可能导致程序崩溃。

51.编写new和delete时需固守常规

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

52.写了placement new也要写placement delete

如若重载了操作符new或delete,并接受额外参数(如size,fstream),该new或delete便称为placement new与placement delete
在这里插入图片描述
在这里插入图片描述
示例:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值