【问题标题】:What is the purpose of "::delete" in C++?C ++中“::delete”的目的是什么?
【发布时间】:2019-01-26 18:23:07
【问题描述】:

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

一个毫无意义的例子是:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        语法

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

        ...

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

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

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

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

        【讨论】:

          【解决方案4】:

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

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

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

          基本上,在解除分配时,编译器查看的析构函数对于全局来说是最局部的——如果在当前作用域中没有找到析构函数,它会查找上一层,直到它到达全局(始终存在)。使用::,将编译器使用的起始范围更改为全局范围。

          查看更多here。它有一整节。

          【讨论】:

            【解决方案5】:

            在某些情况下,operator delete 可能会被重新定义——实际上是重载的——(例如,您的 Class 可能会定义它并同时定义 operator new)。通过编码::delete,您表示您使用的是标准“预定义”deletion 运算符。

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

            【讨论】:

            • 但是分配函数ClassName::operator new (size_t)应该调用另一个分配函数::operator new(size_t)而不是使用new-expression。使用 new-expression 将导致构造函数运行多次。在释放函数中使用 delete-expression 同样会引起麻烦。
            • 需要注意的是,函数的定义很少会被替换(不能重载,因为签名完全一样)。这就是“重新定义”在技术上的含义,并且保证仅适用于标准库中的少数函数,包括 ::operator delete
            【解决方案6】:

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

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

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

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

            【讨论】:

              【解决方案7】:

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

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

              通常是这样

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

              【讨论】:

              • 是的,我愿意!很累
              猜你喜欢
              • 1970-01-01
              • 2010-12-29
              • 2019-01-06
              • 1970-01-01
              • 2019-03-25
              • 1970-01-01
              • 2015-04-02
              • 2021-12-24
              • 1970-01-01
              相关资源
              最近更新 更多