C++ new的内存必须来自操作员new吗?
当考虑一些事情的时候C++ new的内存必须来自操作员new吗?,c++,c++11,C++,C++11,当考虑一些事情的时候 auto x = new T; 该标准是否强制要求内存必须来自运算符new-特定于类或全局?i、 例如,考虑到缺少特定于类的运算符new,一致性实现无法从除全局运算符new?之外的任何地方获得内存,因此不能保证是::运算符new,因为内存可以来自特定于类的运算符new,但如果不存在此类特定于类的版本,则将使用全局版本。本标准的相关部分为[expr.new]/8: 新表达式通过调用分配函数获取对象的存储。。。分配函数的名称为运算符new 我想你搞错了 表达式new T始终由
auto x = new T;
该标准是否强制要求内存必须来自
运算符new
-特定于类或全局?i、 例如,考虑到缺少特定于类的运算符new
,一致性实现无法从除全局运算符new
?之外的任何地方获得内存,因此不能保证是::运算符new
,因为内存可以来自特定于类的运算符new
,但如果不存在此类特定于类的版本,则将使用全局版本。本标准的相关部分为[expr.new]/8
:
新表达式通过调用分配函数获取对象的存储。。。分配函数的名称为运算符new
我想你搞错了 表达式
new T
始终由两个步骤组成:
T
中存在一个,则取该类,否则取全局类。全局的总是存在的,因为这是标准规定的(因此您永远不能“定义”它(因为它已经定义),但您可以替换它)
您可以说::new T
始终无条件地选择全局运算符new
new(a,b,c)T
,那么同样的情况也会发生,只是在步骤1中,我们现在正在寻找具有适当签名的运算符new
重载
该标准是否强制内存必须来自运算符new-特定于类还是全局
是的
§5.3.4[新增解释]
:
p8新表达式通过调用分配函数(3.7.4.1)获得对象的存储。[…]如果分配的类型是非数组类型,分配函数的名称是运算符new
[…]
p9如果新表达式以一元:
运算符开头,则在全局范围中查找分配函数的名称。否则,如果分配的类型是类类型T
或其数组,则在T
的范围内查找分配函数的名称。如果此查找无法找到名称,或者分配的类型不是类类型,则会在全局范围中查找分配函数的名称
因此,除了全局或特定于类的运算符new之外,一致性实现绝对不可能调用任何东西?@DeadMG:我似乎很清楚:存储是从分配函数获得的,分配函数是运算符new。是的,分配/解除分配函数名称是
运算符new/delete/[]
仅限。还请注意,您可以使用::
覆盖特定于类的分配器,以强制执行全局分配器:auto x=::new T
如果您使用了auto x
,是因为T*x
可能是错误的,还是因为T
可能是数组类型?在这种情况下,您要寻找的答案是肯定的,它可以来自操作员new[]
而不是操作员new
?我去给我拿件外套。不,是因为我懒。T的类型是不相关的。