新的内存必须来自新运营商

Does memory for new have to come from operator new?

本文关键字:运营商 内存      更新时间:2023-10-16

在考虑

的线路时
auto x = new T;

标准强制执行内存必须来自operator new-特定于类还是全局?即,鉴于缺少特定于类的operator new,无法从任何地方获取内存,除了全局operator new

我认为您的方式是错误的。

表达式new T总是由两个步骤组成:

  1. 搜索合适的operator new。如果在T级中存在一个,则将其采用,否则将采用全局。全局始终存在,因为这是由标准规定的(因此您永远无法定义"它(因为已经定义),但是您可以 replact it)。

    您可以说::new T总是无条件地选择全局operator new

  2. 一旦调用和成功分配函数,该对象就会在该内存中构造。

如果您说 new (a, b, c) T,那么也发生了同样的情况,只有在步骤1中,我们现在正在寻找具有适当签名的operator new超载。

不能保证为 ::operator new,因为内存可以来自特定于类的 operator new,但是如果不存在此类特定类别的版本,则将使用全局版本。标准的相关部分是[expr.new]/8

通过调用分配函数,新表达可为对象获取存储。...分配函数的名称是操作员新的...

标准强制执行内存必须来自操作员新班级或全局?

是的。

§5.3.4 [expr.new]

p8 a new-expression 通过调用分配函数(3.7.4.1)来获取对象的存储。[...]如果分配的类型是非阵列类型,分配函数的名称是operator new [...]。

p9如果 new-expression 以UNARY ::运算符开始,则分配函数的名称在全局范围中查找。否则,如果分配的类型是类型T或其数组,则分配函数的名称在T的范围中查找。如果此查找未能找到名称,或者分配的类型不是类类型,则分配函数的名称在全局范围中查找。