new/delete 和 ::new/::d elete 有什么区别?

  • 本文关键字:new 区别 delete elete c++ syntax
  • 更新时间 :
  • 英文 :

new delete

::new ::delete

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

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

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

您可以覆盖类别的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
}

第5.3.4节中描述了新的,第9条:

如果 new-expression 以UNARY ::操作员开头,则分配函数的名称在全局范围中查找。否则,如果分配的类型是类型T或其数组,则分配函数的名称在T的范围中查找。如果此查找未能找到名称,或者分配的类型不是类类型,则分配函数的名称在全局范围中查找。

(从N3797草稿开始)

同样适用于delete::delete

::new::delete是全局范围的运营商。您可以使用此语法,以防您的课程过载newdelete。在后一种情况下,在超载new中简单地调用new会导致无限递归,因为您最终致电操作员您只是在定义。

最新更新