我目前正在查看::delete
用于删除指针的 C++ 代码。
一个毫无意义的例子是:
void DoWork(ExampleClass* ptr)
{
::delete ptr;
}
以这种方式使用 delete 关键字的目的是什么?
我目前正在查看::delete
用于删除指针的 C++ 代码。
一个毫无意义的例子是:
void DoWork(ExampleClass* ptr)
{
::delete ptr;
}
以这种方式使用 delete 关键字的目的是什么?
在某些情况下,operator delete
可能会重新定义-实际上重载-(例如,您Class
可能会定义它并定义operator new
)。通过编码::delete
,您说您正在使用标准的“预定义”删除运算符。
重新定义两者的典型用例operator new
以及operator delete
在某些情况下Class
:您希望保留一个隐藏的全局集,其中包含由您创建并由您删除 Class::operator new
的所有指针。但是您的实现 将在调用全局之前从全局集中删除该指针 Class::operator delete
delete
::delete
这是使用表达式delete
,但带有可选::
前缀。
句法
::
(可选)delete
表达式(1)...
new
销毁先前由表达式分配的对象并释放获得的内存区域。
使用::
前缀会影响查找:
释放函数的名称在表达式指向的对象的动态类型范围内查找,这意味着特定于类的释放函数(如果存在)在全局函数之前找到。
如果
::
删除表达式中存在,则此查找仅检查全局名称空间。
delete
在 C++ 中是一个运算符,方式相同=
。因此可以重新实现。就像 一样=
,重新实现特定于它所引用的类。添加::
确保delete
我们调用的运算符是全局运算符,而不是特定于给定类的运算符。
当您重新实现delete
特定类然后想要引用真实类时,这可能很有用。
::delete
是范围的同义词delete
::
。例如Classname::
,表示该类范围内的任何内容。在这种情况下::
,表示默认范围内的任何内容(例如,您不需要包含名称空间的任何内容)
delete 从堆中释放一个指针。不这样做将意味着当程序退出时,该内存块仍被视为由操作系统使用(操作系统通常会清理它,但不释放指针是不好的做法)
所以通常
int* intpointer = new int(5);
//do something with intpointer
delete intpointer
Using::delete
在大型程序中有很多用途,在您的示例中它没有多大意义,但在更大的上下文中使用它确实可以实现以下功能:
::x
指的是全局而不是局部下面的链接有一个很好的解释和例子来仔细考虑。
资料来源:https ://www.geeksforgeeks.org/scope-resolution-operator-in-c/
特定于类的重载
释放函数 (17-24) 可以定义为类的静态成员函数。这些释放函数(如果提供)在删除此类的对象 (17,19,21) 和数组 (18,20,22) 时由 delete-expressions 调用,除非 delete 表达式使用形式 ::delete 绕过类-范围查找。对于这些函数声明,关键字 static 是可选的:无论是否使用关键字,释放函数始终是静态成员函数。
这意味着::delete
不等于delete
。这里的区别delete
可以被覆盖并且特定于您的对象/类。::delete
是全球性的
我知道有些情况你不应该使用“::delete”,它不会起作用
基本上,在释放时,编译器查看的析构函数对于全局来说是最局部的 - 如果在当前范围内找不到析构函数,它会在到达全局之前查找上一层(始终存在)。使用::
, 将编译器使用的起始范围更改为全局范围。
在这里查看更多。它有一整节。
您的班级可能已重载new
并且delete
. So::delete
表示我们指的是全局范围,而不是在当前类中被覆盖的范围。