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