2

私は現在、次のような状況にあります。

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_ptrgetまたは->overloadはありません。'use'についての言及を聞いたことがlock()ありますが、これを正しく行う方法のコード例を誰かに教えてもらえますか?

4

4 に答える 4

6

ここでのより大きな問題は、あいまいな所有権の 1 つだと思います。Aカプセル化するか、その逆かを決定したほうがよいでしょうB。それが不可能な場合は、 と の両方を所有する別のものを導入することをお勧めしclass Cます。AB

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_ptrB をローカル変数にするか、デストラクタで手動で削除することで、取り除くこともできます。

これについては、 Google C++ スタイル ガイドの「スマート ポインター」セクションで詳しく説明しています。

HTH

于 2010-08-26T17:14:07.033 に答える
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_ptra を取得するという考え方です。shared_ptr

まず、取得したポインターが何かを指しているかどうかを確認します。はリソースのweak_ptr存続時間を決定しませんが、リソースがすでに破棄されているかどうかを確認できます。

于 2010-08-26T16:48:06.087 に答える
-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_ptrしてを に昇格させることができます。shared_ptrweak_ptr::lock

于 2010-08-26T16:49:33.383 に答える
-1

今すぐ来てください。

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

^^^^^ 例はそこにあります ^^^^^^

くそ!

于 2010-08-26T16:50:02.993 に答える