2017-08-10 43 views
0

我需要编写/重载/覆盖默认的C++新运算符。我发现这下面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. 

我不能够通过什么叫“非分配安置分配函数”意味着以清除自己?

回答

4

这些重载被放置新的使用。这是一个在内存位置创建对象的表达式,但不会为其分配空间。举例来说,在这个玩具例如:

void foo() { 
    void *raw = malloc(sizeof(int)); 
    int *pint = new(raw) int(10); 

    pint->~int(); 
    free(raw); 
} 

这说明,如果我们需要创造的东西分配的内存中的对象不是C++标准库(在这种情况下,C分配功能),特殊的语法用于在该位置创建对象。

布局操作符new接受地址,并将其原样返回。因此,新表达式只是在那里创建一个对象。当然,我们不能调用delete来释放所说的对象和内存,我们必须做一个显式的析构函数调用,然后是正确的内存释放函数。

+0

注意:伪析构函数调用对于内置类型或具有简单析构函数的类类型是不必要的 –

2

未分配贴片分配函数new的一种形式,它不分配内存,而是在预先分配的内存中构造一个对象。

有关更多详细信息,请参见this answer

0

为了回答您的标题暗示了一个问题:

它不允许提供自己的替代功能的operator new非分配形式。这是覆盖在标准(N4659):

非分配形式 [new.delete.placement]

这些功能被保留; C++程序可能无法定义取代C++标准库中版本的函数。

只能替换被列为可更换下标准的部分标记为[new.delete]所述的operator new形式。