boost :: shared_ptr使用weak_ptr循环中断

时间:2010-08-26 16:31:28

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

我目前的情况如下:

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没有获取或->超载。我听说过“使用lock()”,但是有人能举例说明如何正确执行此操作吗?

4 个答案:

答案 0 :(得分:6)

我认为这里更大的问题是模糊的所有权。您最好决定A是否封装B或其他方式。如果无法做到这一点,那么您最好还介绍另一个拥有class CA的{​​{1}}。

假设B拥有A,您可以写:

B

等等。您甚至可以通过使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) {} }

Google C++ Style Guide在标题为“Smart Pointers”的部分中有更多内容可以说明。

HTH

答案 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不确定资源的生命周期,但它可以让您检查资源是否已被销毁。

答案 2 :(得分:-1)

#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_ptrshared_ptr宣传为weak_ptr::lock

答案 3 :(得分:-1)

现在来吧。

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

^^^^^示例是正确的^^^^^^

该死!