5

在考虑类似的事情时

auto x = new T;

标准是否强制要求内存必须来自operator new特定类别或全局?即,由于缺乏特定于类的实现,没有办法operator new从全局以外的任何地方获取内存operator new

4

3 回答 3

6

我认为你有错误的方式。

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

  1. operator new寻找合适的。如果类T中存在一个,则采用那个,否则采用全局的。全局的总是存在的,因为这是标准规定的(所以你永远不能“定义”它(因为它已经定义了),但你可以替换它)。

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

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

如果你说new (a, b, c) T,那么同样会发生,只是在第 1 步中,我们现在正在寻找operator new具有适当签名的重载。

于 2012-11-02T16:56:13.487 回答
4

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

new-expression 通过调用分配函数来获取对象的存储空间。...分配函数的名称是 operator new ...

于 2012-11-02T16:50:45.960 回答
4

标准是否强制要求内存必须来自 operator new-class-specific 或 global?

是的,它确实。

§5.3.4 [expr.new]

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

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

于 2012-11-02T16:57:39.383 回答