[英]What is the purpose of “::delete” in C++?
我目前正在查看使用::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
的实现将在调用global ::delete
之前从全局集中删除该指针
这是使用delete
表达式 ,但使用可选的::
前缀。
句法
::
:(可选)delete
表达式(1)...
销毁先前由
new
表达式分配的对象,并释放获得的内存区域。
使用::
前缀会影响查找:
释放函数的名称在表达式指向的对象的动态类型的范围内查找,这意味着特定于类的释放函数(如果存在)在全局函数之前找到。
如果删除表达式中存在
::
则此查找仅检查全局命名空间。
C ++中的delete
是一个运算符,方式相同=
is。 因此可以重新实施。 就像=
一样,重新实现特定于它所引用的类。 添加::
确保我们调用的delete
运算符是全局的,而不是特定于给定类的delete
运算符。
当您为特定类重新实现delete
然后想要引用真实类时,这可能很有用。
::delete
与delete
::
是范围的同义词。 例如, Classname::
表示该类范围内的任何内容。 在这个实例中, ::
表示默认情况下作用域的任何内容(例如,您不需要包含命名空间的任何内容)
delete从堆中释放指针。 不这样做意味着当程序退出时,那块内存仍被计算为操作系统使用(操作系统通常会清理它,但是不要释放你的指针是不好的做法)
所以通常
int* intpointer = new int(5); //do something with intpointer delete intpointer
使用::delete
在大型程序中有很多用途,在你的例子中它没有多大意义,但在更大的上下文中使用它确实能够实现以下功能:
::x
指的是全局而不是本地 下面的链接有一个非常好的解释和例子来仔细考虑。
资料来源: https : //www.geeksforgeeks.org/scope-resolution-operator-in-c/
特定于类的重载
释放函数(17-24)可以定义为类的静态成员函数。 这些释放函数(如果提供)在删除此类的对象(17,19,21)和数组(18,20,22)时由delete-expressions调用,除非删除表达式使用了绕过类的形式:: delete-范围查找。 关键字static对于这些函数声明是可选的:无论是否使用关键字,释放函数始终是静态成员函数。
这意味着::delete
不等于delete
。 这里的区别是delete
可以被覆盖,并且特定于您的对象/类。 ::delete
是全局的
我知道有些情况你不应该使用“:: delete”,它不会起作用
基本上,当解除分配时,编译器查看的析构函数是全局最本地的 - 如果在当前作用域中找不到析构函数,它看起来高于一级,直到它到达全局(总是存在)。 使用::
,将编译器使用的起始范围更改为全局范围。
在这里查看更多。 它有一整节。
您的类可能会重载new
和delete
。 所以::delete
表示我们指的是全局范围,而不是那些在当前类中被覆盖的范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.