为了账号安全,请及时绑定邮箱和手机立即绑定

允许删除吗?

允许删除吗?

C++
猛跑小猪 2019-06-25 17:04:50
允许删除吗?是否允许delete this;如果DELETE-语句是对该类实例执行的最后一条语句?当然,我确信由this-指针是new造假的。我在想这样的事情:void SomeModule::doStuff(){     // in the controller, "this" object of SomeModule is the "current module"     // now, if I want to switch over to a new Module, eg:     controller->setWorkingModule(new OtherModule());     // since the new "OtherModule" object will take the lead,      // I want to get rid of this "SomeModule" object:     delete this;}我能做这个吗?
查看完整描述

3 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

是,delete this;定义了结果,只要(正如您已经注意到的)您确保对象被动态分配,并且(当然)在对象被销毁后永远不会尝试使用该对象。多年来,人们一直在问许多关于标准具体内容的问题。delete this;,而不是删除其他指针。答案很简短,很简单:它什么也没说。它只是说delete操作数必须是一个表达式,该表达式指定指向对象或对象数组的指针。delete(§[除删除])没有提到delete this;特别是。关于毁灭的那一节确实提到delete this在一个地方(§[class.dtor]/13):

在虚拟析构函数(包括隐式定义(15.8)的定义点上,非数组解分配函数被确定为对于表达式删除,它出现在析构函数类的非虚拟析构函数中(参见8.3.5)。

这倾向于支持标准考虑的观点delete this;如果它是无效的,那么它的类型就没有意义。这是标准提到的唯一地方delete this;据我所知。

总之,有些人认为delete this一次卑鄙的攻击,并告诉任何愿意倾听的人,这件事应该避免。一个常见的问题是很难确保类的对象只被动态地分配。其他人认为它是一个完全合理的成语,并一直使用它。就我个人而言,我处于中间位置:我很少使用它,但当它似乎是合适的工作工具时,不要犹豫。

使用这一技术的主要时间是对象,它的生命几乎完全是自己的。JamesKanze引用的一个例子是他为一家电话公司工作的计费/跟踪系统。当你开始打电话时,一些东西会注意到这一点,并创建一个phone_call对象。从那时起,phone_call对象处理电话通话的详细信息(当您拨打电话时进行连接,在数据库中添加一个条目以表示呼叫何时开始,如果您进行电话会议,则可能会连接更多的人,等等)。当电话中的最后一个人挂断时,phone_call对象完成其最后的簿记操作(例如,在数据库中添加一个条目以说明何时挂起,以便它们可以计算调用的时间长短),然后破坏自身。的生命周期phone_call对象基于第一个人何时开始调用,以及最后一个人何时离开调用-从系统其他部分的角度来看,它基本上完全是任意的,所以不能将其绑定到代码中的任何词法作用域,或与该顺序相关的任何内容。

对于那些关心这种编码有多可靠的人来说:如果你打电话到欧洲的任何地方,或者通过欧洲的任何地方,很有可能(至少是部分地)通过这样做的代码来处理它。


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 342 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信