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*)可能是添加跟踪信息,但我认为对此的需求会非常低。
| 归档时间: |
|
| 查看次数: |
10581 次 |
| 最近记录: |