C++重写析构函数和成员变量的所有权转移

C++ Override Destructor and ownership transfer of a member variable

我对C++不是很精通。所以我会尽可能清楚地解释我的问题,当你回答时,请做一些解释。

所以我的问题涉及 2 classes(A 和 B)和另一个 class 在我无权访问的框架中。 A 有一个指向 B 的指针,B 有一个指向 A 的指针(原始指针)。以下显示了 2 classes.

之间的交互
class A {
  public:
    void method(){
      this->b_ = new B(this);
      SomeServiceClass::doSomething(std::unique_ptr<B>(this->b_));
    }

  private:
    B *b_;
}

class B {
  public:
    B(A *a){
      this->a_ = a;
    }
    someOtherMethod(){
    }

  private:
    A *a;
}

所以真正发生的是, A 首先创建,然后在 A 的 method() 内部,我创建 B 并将 B 作为 unique_ptr 传递给另一个 [=23] 中实现的其他方法=] 的框架(我没有访问权限)。这样我就可以将 B 的所有权转让给另一个 class。但是在A的生命周期中,我想访问B的其他方法。这就是为什么我在 class A 中保留指向 B 的原始指针的原因。(我本可以使用 shared_ptr 代替,但 SomeServiceClass::doSomething 需要 unique_ptr)。但我的问题是在 A 被销毁的时候。我应该覆盖 A 的析构函数并分配 this->b_ = null 吗?或者也许删除?提前致谢

只要来电

SomeServiceClass::doSomething(std::unique_ptr<B>(this->b_));

结束,unique_ptr 的析构函数已经破坏了它指向的内容,可能 * 使 b_ 成为一个无用的悬挂指针。不要尝试在其他任何地方读取 b_,包括不要在 A 的析构函数中删除它。

如果函数采用 unique_ptr 参数,则该函数声明指向对象的所有权,并且不允许您在函数调用后尝试访问它。您应该回到真正的目标并重新评估您的方法。

(如果一个函数接受了一个unique_ptr&参数,这个函数可能写得不好。至少,你不应该假设调用后存储的指针与调用前相同打电话。)


* b_ 悬空的替代方案涉及 SomeServiceClass 在某个时候调用 unique_ptr::release()。无论哪种情况,原来的指针都不再是你的了。