我怎么能明智地超载贴装操作员新?

sha*_*oth 20 c++ memory-management operator-overloading visual-c++

C++允许超载operator new-全局和每个类-通常operator new,operator new[]所使用new[]的语句和位置operator new分开.

这三个中的前两个通常因使用自定义分配器和添加跟踪而过载.但是放置operator new似乎非常简单 - 它实际上什么也没做.例如,在Visual C++中,默认实现只返回传递给调用的地址:

//from new.h
inline void* operator new( size_t, void* where )
{
   return where;
}
Run Code Online (Sandbox Code Playgroud)

它还能做什么?为什么以及如何明智地超载放置operator new

GMa*_*ckG 16

正确答案是您无法替换新的操作员放置.

§18.4.1.3放置表单
这些函数是保留的,C++程序可能没有定义用于替换标准C++库中的版本的函数.

基本原理:分配和释放运算符的唯一目的是分配和释放内存,因此当给定内存时,不应再进行任何操作.(该标准特别指出这些功能"故意不执行任何其他操作.")

  • 没有用,您仍然可以覆盖特定于类的放置新操作。 (2认同)

Bar*_*nau 5

从技术上讲,放置operator new是指operator new除了所需内存大小之外还需要其他参数的放置。

因此,new(std::nothrow) X使用放置位置operator new, 也是如此new(__FILE__, __LINE__) X

覆盖的唯一原因operator new(size_t, void*)可能是添加跟踪信息,但我认为对此的需求会非常低。

  • 实现它的原因之一可能是强制使用特定的内存分配器;当我们在 Windows 上执行复杂的操作时,我们会遇到这种情况,即必须强制使用一个特定 DLL 而不是另一个 DLL 使用的分配器。(是的,不同的库使用不同的分配器。只要代码将一个库中的“new”与同一库中的“delete”相匹配,这一切都有效。) (3认同)
  • @GMan:使用额外参数调用的“new”被称为“placement new”,无论额外数据是否是应该构造对象的地址。根据标准“*new-placement* 语法用于向分配函数提供附加参数。” (“[expr.new]”部分)。答案的前两句话是正确的。但最后一个是错误的,禁止替换 `::operator new(size_t, void*)` ,因此您无法添加跟踪。 (3认同)