c ++返回已删除对象的方法

时间:2017-09-13 12:15:42

标签: c++ c++11 callstack self-destruction

这是delete this辩论的变体,与中间方法调用的情况有关。

基本上,如果方法A调用方法B,而方法B销毁对象,那么当从B返回时,方法A中是否会发生任何特定的事情?像这样:

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

可以假设只要前一个对象的内存位置没有进一步交互,返回到过期对象的方法就会正常进行吗?

2 个答案:

答案 0 :(得分:3)

它的好受制于:

  1. 必须使用new创建对象。 (请注意,展示位置delete后的new不会很好。

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

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

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

答案 1 :(得分:3)

什么都不会发生。当然有明显的事情需要注意:

  • 确保指向的对象this已分配new
  • 请勿在{{1​​}}之后调用任何其他成员函数,并且在B()之后不访问任何成员变量。
  • B()之后不要使用this,不要使用指针本身。