gpt4 book ai didi

C++ 入门第 5 版 : operator new and operator delete overloading

转载 作者:行者123 更新时间:2023-12-04 00:49:44 25 4
gpt4 key购买 nike

谁能给我解释一下 C++ primer 第 5 版中的这段话:

Terminology: new Expression versus operator new Function

The library functions operator new and operator delete aremisleadingly named. Unlike other operator functions, such as operator=,these functions do not overload the new or delete expressions. In fact, wecannot redefine the behavior of the new and delete expressions.

A new expression always executes by calling an operator new functionto obtain memory and then constructing an object in that memory. A deleteexpression always executes by destroying an object and then calling anoperator delete function to free the memory used by the object.

By providing our own definitions of the operator new and operatordelete functions, we can change how memory is allocated. However, wecannot change this basic meaning of the new and delete operators.

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

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

最佳答案

C++ 中的大多数运算符不受任何显式语义或要求的约束。唯一真正的异常(exception)是 operator newoperator delete,因为它的特殊用途,这就是它所指的。

例如,让我们考虑operator==

尽管让此运算符执行某种比较并返回 bool 以指示相等是常规(而且是明智的)——这实际上不是 C++ 语言所要求的。

事实上,实际上完全有可能定义 operator== 来返回一些完全不相关的东西——也许是一个 int,一个 std::string,或者像 std::tuple 这样更奇怪的东西。而且,当然,它不需要实际上执行任何比较。

实际上,C++ 中大多数运算符的语义是弱需求的约定,但不是语言。

这与 operator newoperator delete 形成对比。 C++ 中的 new 表达式将始终在 operator new 调用返回的指针处开始动态对象的生命周期。这是否是 new (p) T{...} 用于 placement-new 表达式,new T{...} 与 global-new 运算符,或一些 new(args,...) T{...} 用于自定义 operator new -- 它必须返回某种形式T 开始生命周期的指针

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

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

关于C++ 入门第 5 版 : operator new and operator delete overloading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67409792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com