【问题标题】:How does delete deal with pointer constness?delete 如何处理指针常量?
【发布时间】:2009-04-16 13:27:02
【问题描述】:

我正在阅读这个问题 Deleting a const pointer 并想了解更多关于 delete 行为的信息。现在,根据我的理解:

delete expression 分两步工作:

  1. 调用析构函数
  2. 然后通过调用 operator delete 释放内存(通常通过调用 free())。

operator delete 接受void*。作为测试程序的一部分,我重载了operator delete,发现operator delete 不接受const 指针。

由于 operator delete 不接受 const 指针,并且 delete 内部调用 operator delete,Deleting a const pointer 是如何工作的?

delete 在内部使用 const_cast 吗?

【问题讨论】:

    标签: c++ delete-operator


    【解决方案1】:

    const_cast 并没有真正做任何事情——它是一种抑制编译器抱怨对象的常量性的方法。 delete 关键字是编译器构造,编译器知道在这种情况下要做什么,并不关心指针的 const 性。

    【讨论】:

      【解决方案2】:

      正如this answer 所说,delete 不是任何其他方法,而是破坏对象的语言的一部分。 const-ness 与可破坏性无关。

      【讨论】:

        【解决方案3】:

        operator delete 接受 void*。作为测试程序的一部分,我重载了 operator delete 并发现 operator delete 不接受 const 指针。

        你是怎么尝试的?它肯定确实接受 const 指针:

        #include <memory>
        
        int main() {
            void* const px = 0;
            delete px;
            ::operator delete(px);
        }
        

        这段代码是正确的,可以编译(尽管有一个合理的警告)并执行。

        编辑:阅读原始文章 - 您不是在谈论 const 指针,而是 指向 const 的指针,这是另一回事。那里描述了这必须起作用的原因。至于它为什么起作用:其他人已经说过了。

        【讨论】:

          【解决方案4】:

          delete 是一个可以重载的运算符。它将指针作为参数,并释放内存,可能使用free。无论指针是否为const,编译器都允许这样做。

          【讨论】:

          • 这实际上是不正确的。必须在运算符delete(不能更改)和函数operator delete(可以更改)之间做出细微但重要的区别。前者调用后者,但它们相同。
          • @Konrad Rudolph,是的,确实如此,但差别不大。
          【解决方案5】:

          delete 只是调用释放指针指向的内存,它不会改变指针的值或对象。因此,delete 与指向的指针或对象的const-ness 无关。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-08
            • 2016-09-11
            • 1970-01-01
            • 1970-01-01
            • 2019-10-18
            • 1970-01-01
            • 2020-10-23
            相关资源
            最近更新 更多