2017-09-13 60 views
2

这是delete this辩论的变体,与中间方法调用发生了什么。C++返回到删除对象的方法

基本上,如果方法A调用方法B,并且方法B销毁该对象,那么从B返回时方法A中会发生什么特别的事情?事情是这样的:

struct test { 
    void A() { 
    B(); 
    // what happens here besides being unable to dereference `this` anymore? 
    } 
    void B() {delete this;} 
}; 

是否可以假设,返回到过期对象的方法,只要前者对象的内存位置不与任何进一步的交互正常进行?

+0

是的。 ]]]]]]]]]]] –

回答

3

它的精细主题:

  1. 对象必须已与new创建。 (请注意,delete在展示位置new后不会有效)。

  2. 调用delete this;(由于堆栈展开后重新输入的函数没有问题)后,请勿调用任何成员函数或访问成员数据。

  3. 请勿尝试将指针类型指定给this

因此,在你的情况下,没有问题(假设你符合1)。

+3

您的回答比我找到合适的副本的速度快。这不是赞美,顺便说一句。 –

+0

这对我来说不是因为'删除这个',而是因为垃圾收集器与一个对象队列并行运行。队列处理的方式有时候会涉及递归方法调用,所以可以在我的情况下检测何时删除对象,而不用担心与死对象交互。然而,有人怀疑堆栈放卷行为,如果你小心,结果很好,谢谢! –

3

没什么不好发生。当然也有很明显的事情要注意,如:

  • 确保对象this点与new分配。
  • 不要在B()之后调用任何其他成员函数,也不要在B()之后访问任何成员变量。
  • 不要使用this之后的任何东西B(),不,甚至没有指针本身。
+1

你不介意说明“特别”是什么意思吗? – Bathsheba

+1

@Bathsheba我不知道。 –