删除指向const的指针(T const*)

Nav*_*een 83 c++ const delete-operator

我有一个关于const指针的基本问题.我不允许使用const指针调用任何非const成员函数.但是,我可以在const指针上执行此操作:

delete p;
Run Code Online (Sandbox Code Playgroud)

这将调用类的析构函数,它实质上是一个非const'方法'.为什么允许这样做?它只是支持这个:

delete this;
Run Code Online (Sandbox Code Playgroud)

还是有其他原因吗?

小智 104

这是支持:

// dynamically create object that cannot be changed
const Foo * f = new Foo;

// use const member functions here

// delete it
delete f;
Run Code Online (Sandbox Code Playgroud)

但请注意,问题不仅限于动态创建的对象:

{
 const Foo f;
 // use it
} // destructor called here
Run Code Online (Sandbox Code Playgroud)

如果无法在const对象上调用析构函数,则根本不能使用const对象.

  • +1为最新的编辑.我认为这是真正的原因.const对象的自动析构函数调用 - 与删除f几乎相同; 其中f - const上的指针. (21认同)

Pau*_*ams 45

这么说吧-如果它未被允许就没有办法删除const对象不使用的const_cast.

在语义上,const表示对象应该是不可变的.但是,这并不意味着不应删除该对象.

  • 析构函数可以以相当暴力的方式改变对象,所以这必须是我之前没有意识到的"不可变"这个词的一些奇怪用法...... (3认同)

Ind*_*000 5

不应将构造函数和析构函数视为"方法".它们是用于初始化和拆除类的对象的特殊构造.

'const pointer'用于指示在对象处于活动状态时对其执行操作时不会更改对象的状态.


Dan*_*ker 5

看待它的另一种方式:const指针的确切含义是,您将无法对指向的对象进行更改,而该更改可以通过该对象或任何其他指针或对同一对象的引用看到。但是,当一个对象销毁时,指向以前由现在删除的对象占用的地址的所有其他指针不再是指向该对象的指针。它们存储相同的地址,但是该地址不再是任何对象的地址(实际上,它很快可能会被重新用作其他对象的地址)。

如果C ++中的指针的行为像弱引用一样,即当对象被销毁时,指向该对象的所有现有指针都将立即设置为,则这种区别将更加明显0。(这种情况在运行时被认为过于昂贵,无法强加于所有C ++程序,并且实际上不可能使其完全可靠。)

更新:九年后读到这本书,很像律师。我现在发现您的原始反应是可以理解的。禁止突变但允许破坏显然是有问题的。const指针/引用的隐含约定是,它们的存在将充当破坏目标对象(即自动垃圾回收)的障碍。

通常的解决方案是改用几乎所有其他语言。


小智 5

我不允许使用const指针调用任何非const成员函数。

是的,你是。

class Foo
{
public:
  void aNonConstMemberFunction();
};

Foo* const aConstPointer = new Foo;
aConstPointer->aNonConstMemberFunction(); // legal

const Foo* aPointerToConst = new Foo;
aPointerToConst->aNonConstMemberFunction(); // illegal
Run Code Online (Sandbox Code Playgroud)

您已经将指向非const对象的const指针与指向const对象的非const指针混淆了。

话说回来,

delete aConstPointer; // legal
delete aPointerToConst; // legal
Run Code Online (Sandbox Code Playgroud)

由于此处其他答案已经说明的原因,删除其中一个是合法的。