C++ 入门第 5 版:operator new 和 operator delete 重载

Ita*_*iwa 3 c++ new-operator delete-operator new-expression

有人可以向我解释 C++ 入门第 5 版中的这一段:

术语:新表达式与运算符新函数

库函数operator new 和operator delete 被误导了。与其他运算符函数(例如 operator=)不同,这些函数不会重载 new 或 delete 表达式。事实上,我们不能重新定义 new 和 delete 表达式的行为。

new 表达式总是通过调用 operator new 函数来获取内存,然后在该内存中构造一个对象来执行。删除表达式总是通过销毁对象然后调用操作符删除函数来释放对象使用的内存来执行。

通过提供我们自己对 operator new 和 operator delete 函数的定义,我们可以改变内存的分配方式。但是,我们无法更改 new 和 delete 运算符的基本含义。

我没有看到operator neworoperator delete与任何其他重载运算符(如赋值运算符)之间的区别=。那么“被误导性命名”是什么意思?并且我们都知道我们不会像这样覆盖表达式,fObj + fObj但是我们会重载运算符而不是表达式本身。

事实上,我发现这一段本身具有误导性。毕竟我们可以“滥用”任何可重载运算符以及来自哪个运算符newdelete那么他在这一段中的意思是什么?谢谢!

Hum*_*ler 6

C++ 中的大多数运算符不受任何显式语义或要求的约束。唯一真正的例外是operator new并且operator delete由于它的专门用途,这就是它所指的。

例如,让我们考虑operator==.

尽管让这个运算符执行某种比较并返回 a来表示相等是传统的(并且明智的)——这实际上不是 C++ 语言所要求的。bool

事实上,实际上完全有可能定义operator==返回一些完全不相关的东西——可能是 an int、astd::string或者像std::tuple. 而且,当然,它实际上不需要执行任何比较。

实际上,大多数运营商的C ++中的语义弱需要按照惯例,而不是由语言。

这与operator new和形成对比operator deletenewC++ 中的表达式将始终operator new调用返回的指针处开始动态对象的生命周期。无论这是new (p) T{...}用于放置新表达式,new T{...}带有 global-new运算符,还是new(args,...) T{...}用于自定义operator new- 它都必须返回某种形式的指针以在 for 处开始生命周期T

同样,delete必须结束那个生命周期,并调用operator delete释放那个生命周期的底层存储。这有效地强制语义operator newoperator delete分别执行某种形式的分配机制和某种形式的清理机制。真的不可能定义newdelete做一些奇怪的事情(如operator==),因为调用这些运算符的隐含行为将简单地中断(如果它完全编译)。

这就是为什么引用中提到operator new/的行为operator delete不能被重新定义的原因;基本含义永远是固定的。

  • 例如,您可以使用“operator<<”和“operator>>”来执行 I/O,而不是位移位。当然,任何理智的人都不应该考虑这样的事情 (2认同)