【问题标题】:Lifetime of dependent classses in C++?C ++中依赖类的生命周期?
【发布时间】:2016-09-15 14:12:43
【问题描述】:

我有一个类A,它提供了构造类B 实例的方法。而B 持有对A 的私有引用,并提供了一个构造函数来设置这个引用。

class A { 
   public: 
     B* construct_B ();
}
class B {
  private:
    const A& private_A;
  public:
    B ( const A& my_A ): private_A (my_A) { }
}

construct_B 的实现负责动态分配并通过this 将引用传递给自身。

如何以确保A 的生命周期长于B 的方式实现此设置,以使其引用保持有效?请注意,我不关心 construct_B 的所有可能性,而不是返回原始指针,我可以返回智能指针或类似指针。

解决此问题的一种可能方法是使用B 而不是持有一个引用来持有指向A 的智能指针,而不是在construct_B 中动态分配B 以获取对@987654335 的静态引用@ 然后设置它的指针,类似于

class A : 
   public std::enable_shared_from_this<A> { 
   public: 
      void setup_B ( const B& my_B ) { 
        my_B.set_A (shared_ptr_from_this() ) ;
}
class B {
  private:
    const shared_ptr<A> private_A_ptr;
  public:
    void set_A ( const shared_ptr<A> my_A ): 
        private_A_ptr (my_A) { }
}

然后可以通过 诠释主要(){ 一个静态_A; B静态_B; A.setup_B(静态_B); }

最后这个构造的shared_ptr是否避免了AB之前被删除的问题?

【问题讨论】:

  • 您为什么不尝试一下并制作一些控制台输出?但是这里只有当没有人指向A时才会删除A。
  • "最后这个构造的shared_ptr是否避免了A在B之前被删除的问题?是的。唯一需要注意的是,A 本身必须由 shared_ptr 拥有,否则 shared_from_this() 将是 UB。

标签: c++ pointers circular-dependency object-lifetime


【解决方案1】:

shared_ptr 是您的答案。像这样的:

#include <memory>

struct A;

class B {
    const std::shared_ptr<A> private_A_ptr;
  public:
  B(std::shared_ptr<A> parent) : private_A_ptr(std::move(parent)) {}
};

struct A : 
std::enable_shared_from_this<A> 
{ 
  B make_b() {
    return B(shared_from_this());
  }
};

int main()
{
  // this would be invalid:  
  //A a;
  //auto b = a.make_b();

  // but this is fine

  auto pa = std::make_shared<A>();
  auto b = pa->make_b();

  // later...
  pa.reset();

  // A still exists because ownership was shared with b

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多