覆盖新的运算符 - 非分配的放置分配函数

时间:2017-08-10 06:19:39

标签: c++

我需要编写/ 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.

我无法通过" 非分配展示位置分配函数"

的含义清楚自己

3 个答案:

答案 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表单。