平时所使用的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重载的示例
标签:函数,C++,重载,operator,侯捷,new,Foo,delete From: https://www.cnblogs.com/rthete/p/17998023