【问题标题】:boost::shared_ptr cycle break with weak_ptrboost::shared_ptr 与 weak_ptr 的循环中断
【发布时间】:2010-08-26 16:31:28
【问题描述】:

我目前的情况如下:

struct A {  
  shared_ptr<B> b;  
};  
struct B {  
  shared_ptr<A> a;  
};

//...
shared_ptr<A> a(new A());
shared_ptr<B> b(new B());  
a->b(b);
b->a(a);

我知道这行不通,因为引用会继续指向彼此。我也被告知weak_ptr 解决了这个问题。

但是,weak_ptr 没有 get 或 -&gt; 过载。我听说过“使用lock()”,但谁能给出如何正确执行此操作的代码示例?

【问题讨论】:

    标签: c++ boost smart-pointers circular-dependency weak


    【解决方案1】:

    我认为这里更大的问题是所有权不明确。您最好决定是 A 封装 B 还是相反。如果这不可能,那么您最好引入另一个同时拥有ABclass C

    假设A拥有B,你可以这样写:

    classs B;
    
    classs A
    {
    private:
        boost::scoped_ptr<B> b_;
    public:
        A() : b_(new B()) {}
    }
    
    class B
    {
    private:
        A* a_;
    public:
        B(A* a) : a_(a) {}
    }
    

    等等。您甚至可以通过将 B 设为局部变量或在析构函数中手动删除它来摆脱 scoped_ptr

    Google C++ Style Guide 在标题为“Smart Pointers”的部分对此有更多要说的。

    HTH

    【讨论】:

    • +1,看到有人引用 Google C++ 样式指南,我差点哽咽……但一旦我同意他们的观点,明确所有权比在这里和那里撒shared_ptr 更可取。
    • 感谢您的 +1!但我很好奇您对 Google C++ Style Guide 的看法。有什么特别的原因让你觉得它有点令人窒息吗?
    • +1 "这里更大的问题是所有权不明确" 是;您需要首先考虑所有权,并且只有在您了解对象之间的关系时您才能选择使用智能指针。
    【解决方案2】:

    您是否检查过weak_ptr 上的提升参考?

    shared_ptr<int> p(new int(5));
    weak_ptr<int> q(p);
    
    // some time later
    
    if(shared_ptr<int> r = q.lock())
    {
        // use *r
    }
    

    这个想法是你锁定weak_ptr,从而获得一个shared_ptr,它确实有操作员。

    首先检查,获得的指针是否指向某个东西。 weak_ptr 不能确定资源的生命周期,但它可以让您检查资源是否已经被销毁。

    【讨论】:

      【解决方案3】:

      现在来吧。

      http://boost.org/doc/libs/1_42_0/libs/smart_ptr/weak_ptr.htm

      ^^^^^ 例子就在这里^^^^^^

      该死!

      【讨论】:

      • -1 虽然链接到文档很有帮助,但如果链接失效,那么答案应该对未来的访问者有用。除了链接之外,此答案根本不提供任何信息。
      • 对OP态度不好
      【解决方案4】:
      #include <boost/shared_ptr.hpp>
      #include <boost/weak_ptr.hpp>
      
      struct B;
      
      struct A
      {
          boost::weak_ptr< B > b;
      };
      
      struct B
      {
          boost::weak_ptr< A > a;
      };
      
      int
      main()
      {
          boost::shared_ptr<A> a(new A());
          boost::shared_ptr<B> b(new B());
          a->b = b;
          b->a = a; 
          boost::shared_ptr<A> another_a( b->a.lock() );
      }
      

      您可以使用weak_ptr::lockweak_ptr 提升为shared_ptr

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        • 2015-01-21
        • 1970-01-01
        • 2011-09-27
        • 2011-06-26
        • 2011-01-03
        • 1970-01-01
        相关资源
        最近更新 更多