【C++内存管理机制】学习笔记(3):replacement new\重载operate new/::operator new..../new()

435 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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有啥用吗?