delete如何处理指针常量?

时间:2009-04-16 13:27:02

标签: c++ delete-operator

我正在阅读此问题Deleting a const pointer,并希望了解有关delete行为的更多信息。现在,按照我的理解:

delete expression分两步完成:

  1. 调用析构函数
  2. 然后通过调用operator delete来释放内存(通常调用free())。
  3. operator delete接受void*。作为测试程序的一部分,我重载了operator delete,发现operator delete不接受const指针。

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

    delete是否在内部使用const_cast?

5 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

  

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

你是怎么试试的?当然确实接受const指针:

#include <memory>

int main() {
    void* const px = 0;
    delete px;
    ::operator delete(px);
}

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

编辑:阅读原始文章 - 您不是在讨论const指针,而是指向const 的指针,这是其他内容。这里描述了必须工作的原因。至于它为何起作用:其他人已经这样说了。

答案 3 :(得分:1)

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

答案 4 :(得分:-1)

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