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