2016-02-24 171 views
0

在我的代碼中,我使用了boost的shared_from_this特性的共享指針。爲了簡化,共享指針類似的路線如下共享:共享指針參考

class Q: public enable_shared_from_this<Q> 
{ 
public: 

    shared_ptr<Q> f() 
    { 
     return shared_from_this(); 
    } 
} 

int main() 
{ 
    shared_ptr<Q> p(new Q); 
    shared_ptr<Q> q = p->f(); 
    ..... 
    ..... 
} 

當我審視這個在gdb:

(gdb) p *this 
$8 = { 
    .... 
    <boost::enable_shared_from_this<Q>> = { 
    weak_this_ = boost::weak_ptr<Q>(refs=0, weak=2) = { 
     px = (Q *) 0xa11f2000 
    } 
    } 
.... 
} 

什麼是「裁判」弱」引用的意義在這裏?是否refs = 0意味着沒有對象的引用?

謝謝!

回答

3

shared_ptr的控制塊包含兩個引用計數。一個是強引用計數,每個shared_ptr對該對象增加一次。當它變爲零時,對象被銷燬(並且釋放,除非它被分配爲make_shared)。

另一個是弱引用計數,只要有強引用就增加一次,並且對於每個對象都是weak_ptr。當它變爲零時,控制塊將被銷燬並釋放。

所以是的,理論上,調試器顯示refs=0意味着沒有對象的引用。但是,根據程序停止的位置,這聽起來不太可能,在您向我們展示的程序中,p直到main結束,並且不應放棄其強烈參考。可能是調試器的顯示不正確,特別是如果使用優化進行編譯。

編輯:

的2名,而裁判弱計數爲0意味着所有強引用都消失了(全部shared_ptr情況下指的是物體已被破壞),但也有2 weak_ptr小號剩餘;除非您正在查看的快照特別在最後一個shared_ptr的析構函數內,在減少強計數之後但在遞減弱計數之前,這意味着只剩下一個weak_ptr(可能是存儲在enable_shared_from_this中的一個,如果快照在對象的析構函數中)。

你打電話shared_from_thisQ的析構函數,並使用結果沒有檢查空? shared_from_this在構造函數和析構函數中不起作用,並且始終返回null。這可能是導致崩潰的原因,並會導致您觀察到的值。

+0

我懷疑在構造指針p之前程序停在類Q的構造函數中p –

+0

這只是突出顯示shared_ptr如何使用的代碼片段。所以,是的,事實上,有關shared_ptr的問題有很多。 – Maddy

+0

而gdb輸出來自對象的核心分析,該對象的類型爲shared_ptr,析構函數。 – Maddy