新的记忆是否必须来自新的运营商?

时间:2012-11-02 16:42:55

标签: c++ c++11

在考虑

的内容时
auto x = new T;

标准是否强制内存必须来自operator new - 特定于类或全局?也就是说,由于缺乏特定于类的operator new,没有合规的实现可以从除全局operator new以外的任何地方获取内存?

3 个答案:

答案 0 :(得分:6)

我认为你的方法错了。

表达式new T总是包含两个步骤:

  1. 搜索合适的operator new。如果类T中存在一个,则采用该一个,否则采用全局一个。全局版本始终存在,因为这是标准规定的(因此您永远不能“定义”它(因为它已经定义),但您可以替换它。)

    您可以说::new T始终无条件地选择全球operator new

  2. 一旦分配函数被调用并成功,该对象就构建在该内存中。

  3. 如果您说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的范围内查找分配函数的名称。如果此查找未能找到名称,或者分配的类型不是类类型,则在全局范围中查找分配函数的名称。