【发布时间】:2014-07-07 04:39:37
【问题描述】:
众所周知,C++ 标准定义了两种形式的全局分配函数:
void* operator new(size_t);
void* operator new[](size_t);
此外,C++ 标准草案 (18.6.1.2 n3797) 说:
227) 这不是操作员的直接责任 new 或 operator delete 以注意重复 数组的计数或元素大小。执行这些操作 数组中的其他地方 new 和 delete 表达式。数组新 但是,表达式可能会增加运算符的大小参数 新获得空间来存储补充信息。
让我困惑的是:
如果我们从标准中删除void* operator new[](size_t);,而只使用void* operator new(size_t) 会怎样?定义冗余全局分配函数的基本原理是什么?
【问题讨论】:
-
有趣的问题。通常,当向纯 C 系统添加 C++ 支持时,
operator new和operator new[]都只是转身并调用malloc。 -
这里只是推测。但在为类类型重载这些运算符的情况下,这实际上是一个有效的区别,因此使全局版本具有相同的接口也许是一致的。
-
这个注释很奇怪,因为没有理由说明非数组版本也可能不是
increase the size argument to operator new to obtain space to store supplemental information,尽管没有对此发表评论。 -
@Keith:我记得在标准中的某处读到这是明确禁止的 - 发现它 - “它可能大于仅当对象是数组时创建的对象的大小”
-
@Keith:你说“大概没有理由为什么非数组版本也不会增加 operator new 的 size 参数以获得存储补充信息的空间” - 显然你在谈论 @987654328 @ expression 因为这就是标准所说的允许增加的地方 - 我只是说非数组等价物 not 允许这样做。如果你想推测它可能发生在其他地方,那很好,但很明显。
标签: c++ memory-management overloading standards new-operator