C++ 什么';new/delete和::new/::delete之间的区别是什么?

C++ 什么';new/delete和::new/::delete之间的区别是什么?,c++,syntax,C++,Syntax,或 我想知道:的用法,因为如果我删除它们,它似乎可以正常工作 这些都是在自动指针教程中编写的代码 ::new ::delete #包括 大小*分配计数器(){ 返回::新大小\u t; } 无效解除锁定计数器(尺寸*ptr){ ::删除ptr; } ::new和::delete是全局范围内的运算符。如果为类重载new和delete,则使用此语法。在后一种情况下,在重载的new中简单地调用new会导致无限递归,因为您最终会调用刚刚定义的运算符。您可以覆盖类的new,但是::new将始终在

我想知道
的用法,因为如果我删除它们,它似乎可以正常工作

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

::new ::delete
#包括
大小*分配计数器(){
返回::新大小\u t;
}  
无效解除锁定计数器(尺寸*ptr){
::删除ptr;
}  

::new
::delete
是全局范围内的运算符。如果为类重载
new
delete
,则使用此语法。在后一种情况下,在重载的
new
中简单地调用
new
会导致无限递归,因为您最终会调用刚刚定义的运算符。

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

#include <cstddef>  
size_t* alloc_counter(){
    return ::new size_t;  
}  
void dealloc_counter(size_t* ptr){
    ::delete ptr;  
}  
新增§5.3.4第9条规定:

如果新表达式以一元
运算符开头,则会在全局范围中查找分配函数的名称。否则,如果分配的类型是类类型
T
或其数组,则在
T
的范围内查找分配函数的名称。如果此查找无法找到名称,或者分配的类型不是类类型,则会在全局范围中查找分配函数的名称

(截至N3797草案)


同样的情况也适用于
delete
::delete

不为这种类型调用额外的
new
/
delete
?@Serthy:当您从大型共享池中分配对象,但有时只需要为您的进程调用临时对象时?
#include <cstddef>  
size_t* alloc_counter(){
    return ::new size_t;  
}  
void dealloc_counter(size_t* ptr){
    ::delete ptr;  
}  
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
}