【侯捷C++面向对象笔记】补充5-new & delete重载

平时所使用的new和delete操作,称之为表达式,一般由好几个步骤组成。

如上图所示,new表达式会被编译器转化为三个步骤。

new表达式不能重载,但其中operator new是可以重载的。

➡️全局::operator new的重载

why 不能放在namespace内?因为全局operator new是放在default global namespace中的。

➡️类成员函数operator new的重载

operator new/delete operator new[]/delete[]
对象 对象array
sizeof(Foo) sizeof(Foo)*N + 4 (4:存放数组元素个数N)

注意:类成员函数operator new/delete实际都是静态的。本身new操作是创建对象时进行的,而非静态函数需要对象来调用。想在对象创建之前就调用成员函数,那么该成员函数必定是静态函数。(不需要加static关键字,因为编译器默认operator new/delete为静态函数)

一个过程示例

  • Foo* pf = new Foo;编译器寻找类中有没有重载的operator new,若没有则调用全局的::operator new。
  • Foo* pf = ::new Foo;可以强制使用全局的::operator new。

两种情况下的内存操作实例(有无虚析构函数)

  • 有虚析构函数时,sizeof(Foo)会多4字节,因为需要维护一个虚指针。
  • new对象array时,相比对象的整包大小,额外需要4字节作为计数器存储array长度。
  • 析构和构造的顺序相反。

➡️重载operator new

  • class member operator new可以重载多个版本,但每个版本必须是不同的参数列表。
  • 第一个参数必须为size_t,其余参数称为placement arguments,写在new(...)括号内。

➡️重载operator delete

  • 也可以重载class member operator delete,称之为placement operator delete
  • 正常情况下不会被delete调用。只有在new调用的ctor抛出异常时,才会调用重载的operator delete。用来清理未创建成功的object的内存。

➡️应用operator new重载的示例

posted @   rthete  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
主题色彩
点击右上角即可分享
微信分享提示