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
}