8

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

一个毫无意义的例子是:

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

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

4

7 回答 7

10

在某些情况下,operator delete可能会重新定义-实际上重载-(例如,您Class可能会定义它并定义operator new)。通过编码::delete,您说您正在使用标准的“预定义”删除运算符。

重新定义两者的典型用例operator new以及operator delete在某些情况下Class:您希望保留一个隐藏的全局集,其中包含由您创建并由删除 Class::operator new的所有指针。但是您的实现 将在调用全局之前从全局集中删除该指针 Class::operator deletedelete::delete

于 2018-08-20T15:23:13.810 回答
9

这是使用表达式delete但带有可选::前缀。

句法

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

...

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

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

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

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

于 2018-08-20T15:20:10.303 回答
6

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

当您重新实现delete特定类然后想要引用真实类时,这可能很有用。

于 2018-08-20T15:24:55.047 回答
2

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

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

所以通常

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

于 2018-08-20T15:19:53.513 回答
2

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

  • 全局变量访问,所以如果你有本地和全局 x。using::x指的是全局而不是局部
  • 在类之外定义一个函数,不知道你为什么想要或需要这样做,但功能就在那里
  • 访问静态类变量
  • 在多重继承的情况下区分两个或多个类之间的相同变量名

下面的链接有一个很好的解释和例子来仔细考虑。

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

于 2018-08-20T15:25:25.407 回答
1

特定于类的重载
释放函数 (17-24) 可以定义为类的静态成员函数。这些释放函数(如果提供)在删除此类的对象 (17,19,21) 和数组 (18,20,22) 时由 delete-expressions 调用,除非 delete 表达式使用形式 ::delete 绕过类-范围查找。对于这些函数声明,关键字 static 是可选的:无论是否使用关键字,释放函数始终是静态成员函数。

这意味着::delete不等于delete。这里的区别delete可以被覆盖并且特定于您的对象/类。::delete是全球性的

我知道有些情况你不应该使用“::delete”,它不会起作用

基本上,在释放时,编译器查看的析构函数对于全局来说是最局部的 - 如果在当前范围内找不到析构函数,它会在到达全局之前查找上一层(始终存在)。使用::, 将编译器使用的起始范围更改为全局范围。

在这里查看更多。它有一整节。

于 2018-08-20T15:29:40.357 回答
0

您的班级可能已重载new并且delete. So::delete表示我们指的是全局范围,而不是在当前类中被覆盖的范围。

有用的链接:什么是“::operator new”和“::operator delete”?

于 2018-08-20T16:33:50.207 回答