new/delete和:: new/:: delete之间有什么区别?

PEN*_*ONG 10 c++ syntax

new delete
Run Code Online (Sandbox Code Playgroud)

要么

::new ::delete
Run Code Online (Sandbox Code Playgroud)

我想知道它的用途,::因为它似乎正常,如果我删除它们.

这些是在自动指针教程中编写的所有代码.

#include <cstddef>  
size_t* alloc_counter(){
    return ::new size_t;  
}  
void dealloc_counter(size_t* ptr){
    ::delete ptr;  
}  
Run Code Online (Sandbox Code Playgroud)

mya*_*aut 9

您可以覆盖new类,但::new始终在全局范围内搜索.即:

class A {
    void* operator new(std::size_t sz) { 
        /* 1 */ }
};

void* operator new(std::size_t sz) { 
        /* 2 */ }

void f() {
    A* a1 = new A;   // calls A::new (1)
    A* a2 = ::new A; // calls implementation 2 or compiler's new
}
Run Code Online (Sandbox Code Playgroud)

这在第5.3.4节新的第9节中描述:

如果new-expression以一元运算::符开头,则在全局范围中查找分配函数的名称.否则,如果分配的类型是类类型T或其数组,则在范围内查找分配函数的名称T.如果此查找未能找到名称,或者分配的类型不是类类型,则在全局范围中查找分配函数的名称.

(截至N3797草案)

同样适用于delete::delete


vso*_*tco 6

::new并且::delete是全球范围内的运营商.您可以使用此语法,以防您重载newdelete您的类.在后一种情况下,简单地调用new你的重载new导致无限递归,因为你最终调用你刚刚定义的运算符.