繁体   English   中英

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

[英]What is the purpose of “::delete” in C++?

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

一个毫无意义的例子是:

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

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

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

一个典型的用例都重新定义operator newoperator delete在某些Class :要保持一个隐藏的全局组由创建的所有指针Class::operator new删除Class::operator delete 但是, delete的实现将在调用global ::delete之前从全局集中删除该指针

这是使用delete表达式 ,但使用可选的::前缀。

句法

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

...

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

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

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

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

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

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

::deletedelete ::是范围的同义词。 例如, Classname::表示该类范围内的任何内容。 在这个实例中, ::表示默认情况下作用域的任何内容(例如,您不需要包含命名空间的任何内容)

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

所以通常

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

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

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

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

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

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

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

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

基本上,当解除分配时,编译器查看的析构函数是全局最本地的 - 如果在当前作用域中找不到析构函数,它看起来高于一级,直到它到达全局(总是存在)。 使用:: ,将编译器使用的起始范围更改为全局范围。

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

您的类可能会重载newdelete 所以::delete表示我们指的是全局范围,而不是那些在当前类中被覆盖的范围。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM