开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情
replacement new
placement new允许我们将object建立到allocated memory上(就是将对象建立到一个已经分配好的内存中)
上图的说明:
- buf就是一个我们申请的内存空间
- 下一句就是在buf这里放置我们的需要创建的comolex对象(相比于其他new,可以指定放置对象的内存位置)
C++应用程序 分配内存的途径
一般情况下,我们使用new创建一个对象时,代码编译的流程如下图红色圈的地方,本质上还是调用malloc/free
但是我们是否可以自己定义如何分配内存吗?也就是不调用系统默认的函数,而是按照自己的写法进行构造,这就是需要重载new/operate new....
按照下面的路线走
重载::operator new/::operator delete
::operator new/delete是全局operator new函数
::operator new 和::operator delete 全部可以重载,但是
不推荐
重载operator new/operator delete
operator new/delete是类中的一个operator new函数
同理,operator new[]/delete[]也可以进行重载
测试代码:
注意:
- (第一参数必须是size_t)只有new所调用的ctor 抛出异常,才会调用这些重载版的 operator delete()。
- 即使 operator delete() 未能一一对应operator new() 也不会出现任何报错。换句话说:放弃处理构造函数抛出的异常
重载new()/delete()
我们可以重载class member operator new(),写出多个版本,前提是每一版本的声明都必须有独特的参数列,其中第一参数必须是size_t,其余参数以new所指定的placement arguments为初值.出现于new()小括号内的便是所谓placement arguments
我们也可以重载class member operator delete(),写出多个版本.但它们绝不会被delete调用.只有当new所调用的ctor抛出exception,会调用这些重载版的operator delete().它只可能这样被调用,主要用来归还未能完全创建成功的object所占用的memory
测试代码:
注:这里的重载没有理解到,new(100,'a')这个a有啥用吗?