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

What is the purpose of "::delete" in C++?

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

一个无意义的例子是:

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

这样使用delete关键字的目的是什么?

::deletedelete 同义 :: 用于范围。例如 Classname:: 表示 class' 范围内的任何内容。在这种情况下,:: 表示默认范围内的任何内容(例如,您不需要为其包含名称空间的任何内容)

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

通常

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

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

Syntax

::(optional) delete expression (1)

...

Destroys object(s) previously allocated by the new expression and releases obtained memory area.

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

The deallocation function's name is looked up in the scope of the dynamic type of the object pointed to by expression, which means class-specific deallocation functions, if present, are found before the global ones.

If :: is present in the delete expression, only the global namespace is examined by this lookup.

在某些情况下,operator delete might be redefined -actually overloaded- (for example, your Class might define it and also define operator new). By coding ::delete you say that you are using the standard, "predefined", deletion 运算符。

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

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

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

当您为特定的 class 重新实现 delete 然后想引用 真实的 时,这会很有用。

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

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

下面的 link 有很好的解释和示例供您仔细考虑。

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

Class-specific overloads
Deallocation functions (17-24) may be defined as static member functions of a class. These deallocation functions, if provided, are called by delete-expressions when deleting objects (17,19,21) and arrays (18,20,22) of this class, unless the delete expression used the form ::delete which bypasses class-scope lookup. The keyword static is optional for these function declarations: whether the keyword is used or not, the deallocation function is always a static member function.

这意味着 ::delete 不等于 delete。这里的区别是 delete 可以被覆盖并且特定于您的 object/class。 ::delete 是全局的

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

基本上,在释放时,编译器查找的析构函数是全局的最局部的 - 如果在当前作用域中没有找到析构函数,它会查找上一级直到它到达全局(始终存在) ).使用 ::,将编译器使用的起始范围更改为全局范围。

查看更多here。有一整节。

有可能是您的 class 超载了 newdelete。 所以 ::delete 表示我们指的是全局范围,而不是当前 class.

中被覆盖的那些

有用link:What are "::operator new" and "::operator delete"?