我正在查看使用 ::delete
删除指针的 C++ 代码。
一个无意义的示例:
void DoWork(ExampleClass* ptr)
{
::delete ptr;
}
这种方式中使用delete关键字的目的是什么?
我正在查看使用 ::delete
删除指针的 C++ 代码。
一个无意义的示例:
void DoWork(ExampleClass* ptr)
{
::delete ptr;
}
operator delete
(例如,您的Class
可能会定义它并定义operator new
)。通过编写::delete
,表示您使用标准的“预定义”删除运算符。Class
中,重新定义operator new
和operator delete
的典型用例:您想保留一个隐藏的全局指针集,其中存储了由您的Class::operator new
创建并由您的Class::operator delete
删除的所有指针。但是您的delete
的实现将在调用全局::delete
之前从全局集合中移除该指针。这里使用了可选的::
前缀来执行delete
表达式。
语法
::
(可选)delete
expression (1)...
销毁之前由
new
表达式分配的对象并释放已获得的内存区域。
使用::
前缀会影响查找:
对象指针所指的动态类型范围内逐一查找解除分配函数名称,这意味着在全局函数查找时将首先发现类特定的解除分配函数。
如果
::
出现在删除表达式中,则此查找仅考虑全局命名空间。
delete
是一种运算符,就像=
一样。因此,它可以被重新实现。与=
一样,重新实现是特定于它所引用的类的。添加::
确保我们调用的delete
运算符是全局的,而不是特定于给定类的一个。当您重新实现特定类的delete
并希望引用真正的运算符时,这可能非常有用。在大型程序中,使用::delete
有很多用途,在你的例子中可能没有太多意义,但在更大的上下文中使用它可以实现以下功能:
::x
指的是全局而不是局部下面的链接提供了一个相当好的说明和示例供参考。
来源:https://www.geeksforgeeks.org/scope-resolution-operator-in-c/
::delete
同样也是与 delete
等价的。
::
表示作用域。例如,Classname::
表示该类范围内的任何内容。在这个例子中,::
表示任何默认作用域下的内容(例如,任何不需要包含命名空间的内容)。
delete 释放堆上的指针。如果不这样做,那么当程序退出时,该内存块仍然被操作系统认为是正在使用的(操作系统通常会清理这些内容,但不释放指针是一种不好的习惯)。
因此,通常情况下:
int* intpointer = new int(5);
//对 intpointer 进行某些操作
delete intpointer
查看更多这里。有一个完整的部分专门介绍它。
你的类可能重载了new
和delete
,所以::delete
表示我们正在引用全局范围,而不是在当前类中重写的那些。
ClassName::operator new (size_t)
应该调用另一个分配函数::operator new(size_t)
,而不使用 new-expression。使用 new-expression 将导致构造函数运行多次。在释放函数内使用 delete-expression 同样会引起问题。 - Ben Voigt::operator delete
。 - FrankHB