C++代码是否允许直接调用`:运算符New()? 根据C++标准,3.7.3/1对象应动态创建新的表达式,C++运行时应提供分配函数::运算符new .< /p>

C++代码是否允许直接调用`:运算符New()? 根据C++标准,3.7.3/1对象应动态创建新的表达式,C++运行时应提供分配函数::运算符new .< /p>,c++,memory,memory-management,C++,Memory,Memory Management,每隔一段时间就有必要去做一次 < P> C++标准允许调用::运算符new函数,还是仅用于内部使用的这个和相关函数?< /P> < P> >调用new new和操作符直接删除是完全可以接受的;它们是全局名称空间的一部分,就像malloc和free的C++-ier版本一样,与set_new_处理程序和bad_alloc异常进行交互。C++ ISO标准甚至包含了一些例子。例如,§13.5/4有以下示例: 运算符函数通常不直接调用;而是调用它们来评估它们实现的13.5.1-13.5.7的操作符。但是,

每隔一段时间就有必要去做一次


< P> C++标准允许调用::运算符new函数,还是仅用于内部使用的这个和相关函数?< /P> < P> >调用new new和操作符直接删除是完全可以接受的;它们是全局名称空间的一部分,就像malloc和free的C++-ier版本一样,与set_new_处理程序和bad_alloc异常进行交互。C++ ISO标准甚至包含了一些例子。例如,§13.5/4有以下示例:

运算符函数通常不直接调用;而是调用它们来评估它们实现的13.5.1-13.5.7的操作符。但是,在函数调用语法5.2.2中,可以使用运算符函数id作为函数名显式调用它们。[示例:

复数z=a.operator+b;//复数z=a+b

void*p=运算符newsizeofint*n

-[结束示例]


直接调用操作员new和操作员delete是完全可以接受的;它们是全局名称空间的一部分,就像malloc和free的C++-ier版本一样,与set_new_处理程序和bad_alloc异常进行交互。C++ ISO标准甚至包含了一些例子。例如,§13.5/4有以下示例:

运算符函数通常不直接调用;而是调用它们来评估它们实现的13.5.1-13.5.7的操作符。但是,在函数调用语法5.2.2中,可以使用运算符函数id作为函数名显式调用它们。[示例:

复数z=a.operator+b;//复数z=a+b

void*p=运算符newsizeofint*n

-[结束示例]


是的,它允许直接调用全局运算符new函数——尽管不像您可能认为的那样经常需要它。您必须匹配分配和解除分配函数,但如果您对这两个函数都有完全控制权,则始终可以使用带有char的new[]和delete[]。但是,这将是一个新的表达式和删除表达式,因此,如果需要函数指针,只需要使用全局函数本身。否则,必须包装新表达式才能获得函数指针


例如,如果替换这些全局函数,使new和new[]使用不同的堆,那么您可能还希望显式使用::operator new,但这种情况很少见。

是的,允许直接调用全局运算符new函数,尽管不像您认为的那样经常需要它。您必须匹配分配和解除分配函数,但如果您对这两个函数都有完全控制权,则始终可以使用带有char的new[]和delete[]。但是,这将是一个新的表达式和删除表达式,因此,如果需要函数指针,只需要使用全局函数本身。否则,必须包装新表达式才能获得函数指针


例如,如果替换这些全局函数,使new和new[]使用不同的堆,则可能还需要显式使用::operator new,但这种情况很少见。

尚未完成推理,但看起来是允许的。其中一个原因是,我想不出任何其他存在但不可调用的函数,当然除了main。当您重写特定于类的new或当您需要运行时确定的内存块用于放置new(例如std::vector在引擎盖下所做的)时,您应该调用该函数。所以它最好是可调用的。虽然还没有完成推理,但看起来是允许的。其中一个原因是,我想不出任何其他存在但不可调用的函数,当然除了main。当您重写特定于类的new或当您需要运行时确定的内存块用于放置new(例如std::vector在引擎盖下所做的)时,您应该调用该函数。所以它最好是可调用的。