我正在阅读此问题Deleting a const pointer,并希望了解有关delete
行为的更多信息。现在,按照我的理解:
delete expression
分两步完成:
free()
)。 operator delete
接受void*
。作为测试程序的一部分,我重载了operator delete
,发现operator delete
不接受const
指针。
由于operator delete不接受const指针而delete内部调用operator delete,Deleting a const pointer如何工作?
delete
是否在内部使用const_cast?
答案 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
无关。