我需要编写/ overload / override默认的C ++ new运算符。我在information -
下面找到了这个non-allocating placement allocation functions
void* operator new ( std::size_t count, void* ptr );
(9)
void* operator new[]( std::size_t count, void* ptr );
(10)
根据文件说明 -
Called by the standard single-object placement new expression. The standard library implementation performs no action and returns ptr unmodified.
我无法通过" 非分配展示位置分配函数"
的含义清楚自己答案 0 :(得分:4)
这些重载由placement new使用。这是一个在内存位置创建对象的表达式,但不为其分配空间。例如,在这个玩具示例中:
void foo() {
void *raw = malloc(sizeof(int));
int *pint = new(raw) int(10);
pint->~int();
free(raw);
}
这说明如果我们需要在由非C ++标准库(在本例中为C分配函数)的东西分配的内存中创建对象,则使用特殊语法在该位置创建对象。
placement操作符new接受该地址,并保持不变。因此,新表达式只是在那里创建了一个对象。当然,我们不能调用delete来释放所述对象和内存,我们必须做一个显式的析构函数调用,然后是正确的内存释放函数。
答案 1 :(得分:2)
非分配放置分配函数是new
的一种形式,它不分配内存,而是在预先分配的内存中构造一个对象。
有关详细信息,请参阅this answer。
答案 2 :(得分:1)
要回答标题中隐含的问题:
不允许为非分配形式的operator new
提供您自己的替换功能。这包含在标准(N4659)中:
非分配表格 [new.delete.placement]
保留这些功能; C ++程序可能无法定义替换C ++标准库中版本的函数。
您只能在标有[new.delete]标准的部分下替换列为可替换的operator new
表单。