C++允许重载operator new -全局的和每个类的-通常的operator new,operator new[]分别与new[]语句和放置operator new一起使用。
这三种方法中的前两种通常会因为使用自定义分配器和添加跟踪而超载。但是placement operator new看起来非常简单--它实际上不做任何内部的事情。例如,在Visual C++中,默认实现只返回传递给调用的地址:
//from new.h
inline void* operator new( size_t, void* where )
{
return where;
}它还能做什么呢?为什么以及如何明智地重载放置operator new
发布于 2010-09-09 21:45:45
正确的答案是,你不能替换运算符放置新的。
§18.4.1.3放置表单
这些函数是保留的,C++程序不能定义取代标准C++库中的版本的函数。
基本原理:分配和释放操作符的唯一目的是分配和释放内存,所以当给定内存时,不应该再做任何事情。(该标准特别指出,这些函数“故意不执行任何其他操作”。)
发布于 2010-09-09 17:03:19
从技术上讲,放置operator new是任何接受除所需内存大小之外的额外参数的operator new。
因此,new(std::nothrow) X使用放置operator new,new(__FILE__, __LINE__) X也是如此。
覆盖operator new(size_t, void*)的唯一原因可能是添加跟踪信息,但我认为对此的需求将相当低。
发布于 2010-09-09 16:52:47
One example在Stroustrup的常见问题解答中。
https://stackoverflow.com/questions/3675059
复制相似问题