【问题标题】:c++ returning into method of deleted object [duplicate]c ++返回已删除对象的方法[重复]
【发布时间】:2018-02-22 03:40:11
【问题描述】:

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

基本上,如果方法 A 调用方法 B,并且方法 B 破坏了对象,那么从 B 返回时,方法 A 内部会发生什么特别的事情吗?像这样的:

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

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

【问题讨论】:

  • 是的。 ]]]]]]]]]]]

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


【解决方案1】:

没关系:

  1. 对象必须是用new 创建的。 (请注意,在展示位置 new 之后添加 delete 是不行的)。

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

  3. 不要尝试将指针类型分配给this

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

【讨论】:

  • 您的回答比我找到合适的副本还快。顺便说一句,这不是赞美。
  • 这不是因为delete this,而是因为垃圾收集器与对象队列并行运行。处理队列的方式有时涉及递归方法调用,因此在我的情况下可以检测到对象何时被删除,而不用担心与死对象交互。但是对堆栈展开行为有疑问,如果你小心点就可以了,谢谢!
【解决方案2】:

不会有什么不好的事情发生。当然有一些明显的事情需要注意,比如:

  • 确保this 指向的对象是用new 分配的。
  • 不要在B()之后调用任何其他成员函数,也不要在B()之后访问任何成员变量。
  • 不要将this 用于B() 之后的任何内容,不,甚至指针本身也不行。

【讨论】:

  • 您不介意澄清“特别”是什么意思吗?
  • @Bathsheba 我不知道。
猜你喜欢
  • 2015-11-14
  • 2014-01-04
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
相关资源
最近更新 更多