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++库中的版本的函数.
基本原理:分配和释放运算符的唯一目的是分配和释放内存,因此当给定内存时,不应再进行任何操作.(该标准特别指出这些功能"故意不执行任何其他操作.")
从技术上讲,放置operator new
是指operator new
除了所需内存大小之外还需要其他参数的放置。
因此,new(std::nothrow) X
使用放置位置operator new
, 也是如此new(__FILE__, __LINE__) X
。
覆盖的唯一原因operator new(size_t, void*)
可能是添加跟踪信息,但我认为对此的需求会非常低。