新的内存必须来自新运营商
Does memory for new have to come from operator new?
在考虑
的线路时auto x = new T;
标准强制执行内存必须来自operator new
-特定于类还是全局?即,鉴于缺少特定于类的operator new
,无法从任何地方获取内存,除了全局operator new
?
我认为您的方式是错误的。
表达式new T
总是由两个步骤组成:
-
搜索合适的
operator new
。如果在T
级中存在一个,则将其采用,否则将采用全局。全局始终存在,因为这是由标准规定的(因此您永远无法定义"它(因为已经定义),但是您可以 replact it)。您可以说
::new T
总是无条件地选择全局operator new
。 -
一旦调用和成功分配函数,该对象就会在该内存中构造。
如果您说 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
的范围中查找。如果此查找未能找到名称,或者分配的类型不是类类型,则分配函数的名称在全局范围中查找。
- 呼叫运营商<<临时
- 两个运营商的一些奇怪的冲突<<
- 如何在 CPP 中访问家长的运营商
- 如何明确调用好友流运营商
- 私有运营商删除会触发 GCC 和 Clang 的编译时错误,但不会在 MSVC 上触发编译时错误
- 使用运营商New分配的数据结构是否有任何副作用
- "Inheriting"移动运营商?
- 朋友ostream&运营商<<无法访问私人会员
- 为什么在下面的代码返回类型中是用于运营商重载的类类型
- 范围的枚举(枚举类)关系运营商
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 对这两个分配运营商之间的不同感到困惑
- 我的班级意外加法运营商
- OpenACC - C++"新"运营商问题
- c 对运营商的一致性是新的,有多少重要
- 为什么我不能使私人运营商成为新的并使用默认实现?
- 全球取代所有新运营商
- 包装C 朋友在Cython中的非会员运营商
- 合法的交换运营商的模板实施
- 新的内存必须来自新运营商