"删除这个"是否安全?

Cri*_*omo 33 c++ runtime-error self-destruction

在我最初的基本测试中,这样做是完全安全的.然而,它已经让我吃惊试图操纵this该功能后delete小号this可能是一个运行时错误.这是真的,通常是安全的delete this吗?或者只有某些安全的情况?

Chr*_*son 46

delete this是合法的并且做你期望的事情:它调用你的类的析构函数并释放底层内存.之后delete this的回报,你的this指针值并没有改变,所以它现在是一个悬摆指针应该不会被取消引用.这包括使用类的成员变量进行隐式解除引用.

通常在引用计数类中找到,当ref-count递减为0时,DecrementRefCount()/ Release()/无论成员函数调用什么delete this.

delete this由于许多原因,通常被认为是非常糟糕的形式 以后很容易意外访问成员变量delete this.来电者代码可能无法实现您的对象具有自毁功能.

此外,delete this您的代码可能没有对象所有权的对称策略(谁分配和删除谁)是一种"代码味道".一个对象不能自己分配new,所以调用delete this意味着A类正在分配一个对象,但是B类稍后会释放它[self].

  • 你没有提到[你不能在析构函数中调用`delete this`](http://stackoverflow.com/a/447531/111307). (7认同)
  • "删除这个通常被认为是非常糟糕的形式,原因很多." 我认为这就是为什么精心设计的引用计数类不使用删除这个; .他们使用手柄/身体成语.在我看来,使用删除这几乎总是一个坏主意.(好吧,我不知道*任何*理由 - 但我要小心) (3认同)
  • 从技术上讲,你的最后一段是不正确的.虽然对象无法自行分配,但这并不意味着您下次去的地方.因此,不是因为另一个类分配了它.同一个类上的静态工厂方法可以完成创建. (2认同)

Jar*_*Par 16

删除"this"是安全的,只要它基本上是方法中的最后一个操作.事实上,有几个专业级别的API会这样做(参见ATL的CComObject实现示例).

唯一的危险是在调用"删除此"后尝试访问任何其他成员数据.这当然不安全.

  • 在析构函数中调用`delete this`也有危险 (4认同)

180*_*ION 13

删除这是完全合法的,因为其他人已经提到过.尚未提及的另一个原因是冒险的 - 您假设该对象已在堆上分配.这可能难以保证,尽管在引用计数实现的情况下通常不是问题.

  • "适当的"解决方案是拥有私有析构函数.然后,对象可以调用delete this,但是您无法建立基于堆栈的版本. (8认同)

小智 13

但是不要在析构函数中做到这一点!

  • 是的,这很糟糕. (2认同)

Bru*_*kin 6

正如其他人所说,删除这是一个有效的习惯用法,但为了安全起见,你必须确保对象永远不会在堆栈上实例化.

一种方法是使构造函数和析构函数都是私有的,并通过类工厂函数强制创建对象,该函数在堆上创建对象并返回指向它的指针.类工厂可以是静态成员函数或友元函数.然后可以通过执行"删除此操作"的对象上的Delete()方法完成清理.COM对象基本上以这种方式工作,除此之外,它们是引用计数,当引用计数减少到零时发生"删除此".