8

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

delete expression分两步工作:

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

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

由于 operator delete 不接受 const 指针,并且 delete 在内部调用 operator delete,所以删除 const 指针是如何工作的?

delete内部使用 const_cast 吗?

4

5 回答 5

13

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

于 2009-04-16T13:45:46.453 回答
4

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

于 2009-04-16T13:42:02.297 回答
3

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

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

#include <memory>

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

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

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

于 2009-04-16T13:53:00.243 回答
1

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

于 2009-04-16T13:47:02.863 回答
-1

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

于 2010-05-04T02:44:49.360 回答