gpt4 book ai didi

c++ - 为什么 delete 可以在指向 const 的指针上执行而 free 不能?

转载 作者:可可西里 更新时间:2023-11-01 14:54:36 34 4
gpt4 key购买 nike

我刚刚注意到传递给 delete 的指针可以是 const 限定的,而传递给 free 的指针则不能。这对我来说真是个惊喜。

在 C++ 中,operator delete 的重载应该有如下签名:

void operator delete(void* p);

但是给参数指针加一个const是无效的:

void operator delete(void const* p);

谁能告诉我为什么delete是这样设计的?

最佳答案

free 不应与实际的 C++ 对象一起使用。 free 应与 malloc 一起使用,因此您不应在使用 new 分配的内容上使用 free

至于为什么可以delete const对象,很简单:

const Type *ptr = new Type(...);

现在呢?如果你不能删除它,那么你必须这样做:

delete const_cast<Type*>(ptr);

让一个对象成为const 意味着它不能被修改。您不能使对象从一种状态变为另一种状态。删除就是扔掉它。这意味着它不再以任何状态存在,无论是原始状态还是其他一些修改后的形式。删除是一种存在于对象可变性状态之外的操作,很像构造。

从概念上讲,删除既不是常量也不是非常量。虽然析构函数是非常量函数,但破坏对象的想法完全超出了 const 或非常量的范围。


好的,假设您定义了 operator delete 来获取 pointer to const (which is different from a const pointer) :

void operator delete(void const* p);

这个函数的第一行是什么? operator delete 的目的是释放由operator new 分配的内存。这将需要查看内存分配堆上的位。为此,您需要一个不指向常量数据的指针:

void *ptr = const_cast<void*>(p);

Welcome to undefined behavior .虽然 C++ 允许您这样做,但规范非常清楚,尝试写入 ptr(或基于它的任何地址)的结果未定义。你得到了一个 const 指针;外界告诉你不要修改它指向的东西。 C++ 不保证当您违反契约(Contract)时会发生什么。

由于规范声明这是未定义的行为,并且由于 operator delete(在大多数情况下)无法完成其工作如果不修改 指向的内存p(或根据该地址修改内存),然后允许您以这种方式定义 operator delete 的规范将是愚蠢的。这基本上会把搬起石头砸自己的脚的想法奉为神明。

是的,在几乎所有情况下,这都是完全安全的。但是既然你无论如何都要放弃 const,为什么还要费心去允许这个相当可疑的想法呢?

关于c++ - 为什么 delete 可以在指向 const 的指针上执行而 free 不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6965796/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com