我可以使用要删除的对象的回调删除另一个拥有的对象吗?

nai*_*ich 2 c++ object delete-operator

我有一个class(A)知道什么时候应该删除它.我相信一个对象不能直接删除自己(即,你不能从里面调用析构函数)所以我使用了一个回调.

这是我当前解决方案的伪代码:

class A {
  Owner* owner; // is set in constructor

  A(Owner* ow) : owner(ow) {}
  void willDeleteOurself() {
    owner->deleteObject();
  }
} 

class Owner {
  A* obj;

  Owner() { // e.g. constructor
    obj = new A(this);
  }

  void deleteObject() {
    delete obj;
  }
}
Run Code Online (Sandbox Code Playgroud)

我有一个Owner拥有类对象的类对象A.现在,在某些时候,obj"知道"它应该被删除,并且发生呼叫willDeleteOurself().这段代码似乎有效.

现在,我的问题是:这是一种安全的删除方式 obj吗?

我担心的是,当方法deleteObject返回(到达})时,它会跳回到结尾willDeleteOurself(),但是该方法被调用的对象已被破坏.

当我obj在调用之后没有更多语句引用时,这个构造是否安全owner->deleteObject();

更新:

谢谢你的回答.我在这里简化了一下.我没有A* obj;,但是对象的增强smartpointer(单独,有时在地图中).我想如果我调用delete this包装对象,smartpointer将无法识别基础对象被删除.那是对的吗?

由于delete this(以及我上面的代码)是"危险的",有没有更安全的方法来解决我的问题?

Bjö*_*lex 5

这实际上是一样的调用好的delete this;willDeleteYourself.如果您在删除后不访问任何成员,则可以.