【问题标题】:C++ Override Destructor and ownership transfer of a member variableC++ 重写析构函数和成员变量的所有权转移
【发布时间】:2021-06-23 15:12:01
【问题描述】:

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

所以我的问题涉及 2 个类(A 和 B)以及我无法访问的框架中的另一个类。 A 有一个指向 B 的指针,B 有一个指向 A 的指针(原始指针)。下面展示了 2 个类之间的交互。

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 传递给在另一个框架类中实现的其他方法(我没有t 有权访问)。这样我就可以将 B 的所有权转移给另一个班级。但是在 A 的生命周期中,我想访问 B 的其他方法。这就是为什么我在 A 类中保留一个指向 B 的原始指针。(我本可以使用 shared_ptr,但 SomeServiceClass::doSomething 需要 unique_ptr)。但我的问题是在 A 被摧毁的时候。我应该覆盖 A 的析构函数并分配 this-&gt;b_ = null 吗?或者也许删除?提前致谢

【问题讨论】:

  • B::_a 拥有 A 的实例吗?如果是,则将其删除(在 B 的析构函数中)。如果没有,那就不要。如果不知道,我们无法帮助您,因为这是一个设计问题。
  • 去掉A中的B *b_;。请求SomeServiceClass获取你可以使用的B*

标签: c++ c++11 destructor unique-ptr member-function-pointers


【解决方案1】:

只要调用到

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

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

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

(如果函数接受unique_ptr&amp; 参数,那么该函数可能写得不好。至少,您不应假设调用后存储的指针与调用前相同。)


*b_ 悬空的替代方案涉及SomeServiceClass 在某些时候调用unique_ptr::release()。无论哪种情况,原始指针都不再是您可以访问的。

【讨论】:

  • 好点。框架可以无限期地存储B 或立即销毁它,并且没有办法知道(除了阅读框架的文档)。保留和使用对B 的引用很容易成为致命错误。
猜你喜欢
  • 2020-02-15
  • 2011-09-13
  • 1970-01-01
  • 2020-07-15
  • 2020-02-16
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
相关资源
最近更新 更多