free 不应与实际的 C++ 对象一起使用。 free 应该与malloc 一起使用,因此您不应该在使用new 分配的东西上使用free。
至于为什么可以delete const 对象,很简单:
const Type *ptr = new Type(...);
现在呢?如果你不能删除它,那么你必须这样做:
delete const_cast<Type*>(ptr);
对象为const 意味着它不能被修改。您不能使对象从一种状态变为另一种状态。删除就是把它扔掉。这意味着它不再以 any 状态存在,无论是原始形式还是其他修改形式。删除是一种存在于对象可变状态之外的操作,很像构造。
从概念上讲,删除既不是 const 也不是非常量。虽然析构函数是非常量函数,但破坏对象的想法完全超出了 const 或非常量的范围。
好的,假设您将operator delete 定义为pointer to const (which is different from a const pointer):
void operator delete(void const* p);
这个函数的第一行是什么? operator delete 的目的是释放由operator new 分配的内存。这将需要戳内存分配堆上的位。为此,您需要一个不指向 const 数据的指针:
void *ptr = const_cast<void*>(p);
Welcome to undefined behavior。虽然 C++ 允许您这样做,但规范非常明确,尝试写入 ptr(或任何基于它的地址)的结果是未定义。你得到了一个 const 指针;外界告诉你不要修改它指向的东西。 C++ 不保证您违反该合同时会发生什么。
由于规范声明这是未定义的行为,并且由于operator delete(在大多数情况下)无法完成其工作修改p指向的内存(或修改基于该地址),然后允许您以这种方式定义operator delete将是愚蠢的规范。这基本上就是将射击自己的脚的想法规范化。
是的,几乎在所有情况下,这都是完全安全的。但是,既然您无论如何都要抛弃 const,为什么还要费心让这个相当可疑的想法摆在首位呢?