根据C ++标准段落3.7.3 / 1,对象应使用 new 表达式动态创建,C ++运行时应提供分配函数::operator new()
。
偶尔需要call ::operator new()
directly。
C ++标准是否允许对::operator new()
函数进行此类调用,或者此(和相关)函数是否仅供内部使用?
答案 0 :(得分:4)
直接致电operator new
和operator delete
完全可以接受;它们是全局命名空间的一部分,其作用类似于C ++ - malloc
和free
版本,与set_new_handler
和bad_alloc
异常相互作用更好一些。 C ++ ISO标准甚至包含一些这样的例子。例如,§13.5/ 4有这个例子:
通常不直接调用操作员函数;相反,它们被调用来评估它们实现的运算符(13.5.1 - 13.5.7)。但是,可以使用 operator-function-id 作为函数调用语法(5.2.2)中函数的名称来显式调用它们。 [实施例:
复杂z = a.operator +(b); // complex z = a + b;
void * p = operator new(sizeof(int)* n);
-end example]
答案 1 :(得分:2)
是的,允许直接调用全局运算符的新函数 - 尽管它并不像您可能认为的那样经常需要。您必须匹配分配和释放功能,但如果您完全控制两者,则可以始终使用new []和delete [] with char。但是,这将是一个new-expression和delete-expression,因此如果需要函数指针,只需要“自己”使用全局函数。 (你必须包装new-expression才能得到函数指针,否则。)
如果替换这些全局函数以便new和new []使用不同的堆,例如,那么您可能还需要显式地使用:: operator new,但这种情况很少见。