在C++中,"::delete"的用途是什么?

8

我正在查看使用 ::delete 删除指针的 C++ 代码。

一个无意义的示例:

void DoWork(ExampleClass* ptr)
{
    ::delete ptr;
}

这种方式中使用delete关键字的目的是什么?
7个回答

10
在某些情况下,可能会重新定义(实际上是重载)operator delete(例如,您的Class可能会定义它并定义operator new)。通过编写::delete,表示您使用标准的“预定义”删除运算符。
在某些Class中,重新定义operator newoperator delete的典型用例:您想保留一个隐藏的全局指针集,其中存储了由您的Class::operator new创建并由您的Class::operator delete删除的所有指针。但是您的delete的实现将在调用全局::delete之前从全局集合中移除该指针。

2
但是分配函数 ClassName::operator new (size_t) 应该调用另一个分配函数 ::operator new(size_t),而不使用 new-expression。使用 new-expression 将导致构造函数运行多次。在释放函数内使用 delete-expression 同样会引起问题。 - Ben Voigt
需要注意的是,函数的定义很少能够被“替换”(不是“重载”,因为签名完全相同)。这就是“重新定义”的技术含义,这只有在标准库中的一些函数中才能保证有效,包括::operator delete - FrankHB

9

这里使用了可选的::前缀来执行delete表达式。

语法

::(可选) delete expression (1)

...

销毁之前由new表达式分配的对象并释放已获得的内存区域。

使用::前缀会影响查找:

对象指针所指的动态类型范围内逐一查找解除分配函数名称,这意味着在全局函数查找时将首先发现类特定的解除分配函数。

如果::出现在删除表达式中,则此查找仅考虑全局命名空间。


7
在C++中,delete是一种运算符,就像=一样。因此,它可以被重新实现。与=一样,重新实现是特定于它所引用的类的。添加::确保我们调用的delete运算符是全局的,而不是特定于给定类的一个。当您重新实现特定类的delete并希望引用真正的运算符时,这可能非常有用。

3

在大型程序中,使用::delete有很多用途,在你的例子中可能没有太多意义,但在更大的上下文中使用它可以实现以下功能:

  • 全局变量访问,因此如果您有本地和全局x,则使用::x指的是全局而不是局部
  • 在类外定义函数,不确定为什么需要这样做,但功能是存在的
  • 访问静态类变量
  • 在多重继承的情况下区分两个或多个类之间相同的变量名

下面的链接提供了一个相当好的说明和示例供参考。

来源:https://www.geeksforgeeks.org/scope-resolution-operator-in-c/


2

::delete 同样也是与 delete 等价的。 :: 表示作用域。例如,Classname:: 表示该类范围内的任何内容。在这个例子中,:: 表示任何默认作用域下的内容(例如,任何不需要包含命名空间的内容)。

delete 释放堆上的指针。如果不这样做,那么当程序退出时,该内存块仍然被操作系统认为是正在使用的(操作系统通常会清理这些内容,但不释放指针是一种不好的习惯)。

因此,通常情况下:

int* intpointer = new int(5); //对 intpointer 进行某些操作 delete intpointer


是的,我做!非常疲倦。 - Prodigle

1
特定类别的重载 (17-24)的释放函数可以定义为类的静态成员函数。如果提供了这些释放函数,则在删除此类的对象(17,19,21)和数组(18,20,22)时,由delete表达式调用这些函数,除非delete表达式使用绕过类作用域查找的形式::delete。对于这些函数声明,关键字static是可选的:无论是否使用关键字,释放函数始终是静态成员函数。
这意味着::delete不等于delete。这里的区别是delete可以被覆盖,并且特定于您的对象/类。::delete是全局的
我知道有些情况下不应使用“::delete”,它将无法工作
基本上,在解除分配时,编译器查找的析构函数是最接近全局的-如果当前范围中未找到析构函数,则向上查找一级,直到达到全局(始终存在)。使用“::”会更改编译器使用的起始范围为全局范围。

查看更多这里。有一个完整的部分专门介绍它。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接