在考虑
的内容时auto x = new T;
标准是否强制内存必须来自operator new
- 特定于类或全局?也就是说,由于缺乏特定于类的operator new
,没有合规的实现可以从除全局operator new
以外的任何地方获取内存?
答案 0 :(得分:6)
我认为你的方法错了。
表达式new T
总是包含两个步骤:
搜索合适的operator new
。如果类T
中存在一个,则采用该一个,否则采用全局一个。全局版本始终存在,因为这是标准规定的(因此您永远不能“定义”它(因为它已经定义),但您可以替换它。)
您可以说::new T
始终无条件地选择全球operator new
。
一旦分配函数被调用并成功,该对象就构建在该内存中。
如果您说new (a, b, c) T
,那么同样的情况发生,只有在步骤1中我们正在寻找具有相应签名的operator new
重载。
答案 1 :(得分:4)
不能保证::operator new
,因为内存可以来自特定类operator new
,但如果不存在此类特定版本,则将使用全局版本。标准的相关部分是[expr.new]/8
:
new-expression通过调用分配函数来获取对象的存储空间。 ...分配函数的名称是operator new ...
答案 2 :(得分:4)
标准是否强制内存必须来自运营商特定于新类或全局?
是的,确实如此。
§5.3.4 [expr.new]
:
p8 new-expression 通过调用分配函数(3.7.4.1)获取对象的存储空间。 [...]如果分配的类型是非数组类型,分配函数的名称为
operator new
[...]。p9如果 new-expression 以一元
::
运算符开头,则在全局范围内查找分配函数的名称。否则,如果分配的类型是类类型T
或其数组,则在T
的范围内查找分配函数的名称。如果此查找未能找到名称,或者分配的类型不是类类型,则在全局范围中查找分配函数的名称。