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