boost :: shared_ptr цикл с ослаблением - PullRequest
2 голосов
/ 26 августа 2010

Я сейчас нахожусь в ситуации, подобной:

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 или ->. Я слышал упоминания об «использовании lock()», но кто-нибудь может привести примеры кода, как это сделать правильно?

Ответы [ 4 ]

6 голосов
/ 26 августа 2010

Я думаю, что большая проблема здесь заключается в неоднозначной собственности. Вам лучше решить, инкапсулирует ли A B или наоборот. Если это невозможно, вам все же лучше представить еще один class C, которому принадлежат A и B.

Предполагая, что 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) {}
}

И так далее. Вы даже можете избавиться от scoped_ptr, сделав B локальной переменной или удалив ее вручную в деструкторе.

Руководство по стилю Google C ++ может подробнее рассказать об этом в разделе " Умные указатели ."

НТН

2 голосов
/ 26 августа 2010

Вы проверили ссылку наддува на 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 не определяет срок службы ресурса, но позволяет проверить, был ли ресурс уже уничтожен.

0 голосов
/ 26 августа 2010

Давай сейчас.

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

^^^^^ ПРИМЕР ПРАВДА ТАМ ^^^^^^

ЧЕРТ!

0 голосов
/ 26 августа 2010
#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 до shared_ptr, используя weak_ptr::lock.

...