【侯捷C++面向对象笔记】补充5-new & delete重载
平时所使用的new和delete操作,称之为表达式,一般由好几个步骤组成。
如上图所示,new表达式会被编译器转化为三个步骤。
new表达式不能重载,但其中operator new
是可以重载的。
➡️全局::operator new的重载
why 不能放在namespace内?因为全局operator new是放在default global namespace中的。
➡️类成员函数operator new的重载
注意:类成员函数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重载的示例
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端