C ++中“ :: delete”的目的是什么?

时间:2018-08-20 15:17:38

标签: c++ delete-operator scope-resolution

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

一个无意义的例子是:

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

以这种方式使用delete关键字的目的是什么?

7 个答案:

答案 0 :(得分:11)

在某些情况下,operator delete可能实际上被重定义了(例如,您的Class可以定义它,也可以定义operator new)。通过编码::delete,您表示您正在使用标准的“预定义” deletion运算符。

在某些operator new中重新定义operator deleteClass的典型用例:您想保留由您的创建的所有指针的隐藏全局集合。 Class::operator new并被您的 Class::operator delete删除。但是您的delete的实现将在调用全局::delete

之前从全局集中删除该指针。

答案 1 :(得分:9)

这使用the delete expression,但带有可选的::前缀。

  

语法

     

::(可选)delete表达式(1)

     

...

     

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

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

  

在以下范围内查找释放函数的名称   表达式所指向的对象的动态类型,这意味着   特定于类的释放函数(如果存在)先于   全球的。

     

如果删除表达式中包含::,则此查找仅检查全局名称空间。

答案 2 :(得分:6)

C ++中的

delete是运算符,与=相同。因此,可以重新实现它。就像=一样,重新实现特定于它所引用的类。添加::可以确保我们正在调用的delete运算符是全局运算符,而不是特定于给定类的运算符。

当您为特定的类重新实现delete然后想要引用 real 时,这很有用。

答案 3 :(得分:2)

::deletedelete的同义词 ::用于范围。例如Classname::表示该类范围内的所有内容。在这种情况下,::表示默认范围内的所有内容(例如,不需要包含名称空间的任何内容)

delete从堆中释放指针。不这样做将意味着在程序退出时,该内存块仍被视为操作系统正在使用的内存(操作系统通常会清理掉该内存,但是不释放指针是不明智的做法)

通常这样

int* intpointer = new int(5); //do something with intpointer delete intpointer

答案 4 :(得分:2)

在大型程序中使用::delete有很多用途,在您的示例中,它没有多大意义,但在较大的上下文中使用它可以启用以下功能:

  • 全局变量访问,因此如果您具有局部和全局x。使用::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)

您的班级有可能重载了newdelete。 因此,::delete表示我们指的是全局范围,而不是当前类中已被覆盖的范围。

有用的链接:What are "::operator new" and "::operator delete"?