代码之家  ›  专栏  ›  技术社区  ›  aJ.

删除如何处理指针常量?

  •  8
  • aJ.  · 技术社区  · 17 年前

    我在读这个问题 Deleting a const pointer 想了解更多 delete 行为。现在,根据我的理解:

    delete expression 分两步工作:

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

    operator delete 接受一 void* . 作为测试程序的一部分,我超载了 运算符删除 发现 运算符删除 不接受 const 指针。

    由于operator delete不接受const指针,而delete内部调用operator delete,如何 删除常量指针 工作?

    删除 内部使用const-cast?

    5 回复  |  直到 16 年前
        1
  •  13
  •   sharptooth    17 年前

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

        2
  •  4
  •   Community Mohan Dere    9 年前

    AS this answer 说, delete 不是像其他方法一样的方法,而是语言中销毁对象的一部分。 const -本质与破坏性无关。

        3
  •  2
  •   Konrad Rudolph    17 年前

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

    你是怎么试的?当然 接受常量指针:

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

    此代码是正确的,编译(尽管带有合理的警告)并执行。

    编辑 :阅读原文“你不是在谈论常量指针,而是 指向的指针 const 这是另外一回事。这里描述了为什么必须这样做。至于它为什么起作用:其他人已经说过了。

        4
  •  1
  •   Zifre    17 年前

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

        5
  •  -1
  •   Nick Strupat    16 年前

    delete 只需调用释放指针指向的内存,它既不会更改指针的值,也不会更改对象。因此, 删除 与…无关 const -指针或对象的指向性。