簡體   English   中英

boost :: shared_ptr與weak_ptr的循環中斷

[英]boost::shared_ptr cycle break with weak_ptr

我目前處於類似情況:

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或->重載。 我聽說過提到過“ use lock() ”的方法,但是有人可以給出正確執行此操作的代碼示例嗎?

我認為這里更大的問題是所有權不明確的問題之一。 您最好決定A封裝B還是反之。 如果這不可能,那么您最好引入另一個擁有AB class 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局部變量或在析構函數中手動將其刪除來擺脫scoped_ptr

Google C ++樣式指南在標題為“ 智能指針 ”的部分中對此有更多說明。

HTH

您是否檢查了weak_ptr上的Boost參考?

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不能確定資源的生存時間,但可以讓您檢查資源是否已被銷毀。

#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

快過來

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

^^^^^例子對了^^^^^^

該死的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM