2014-02-24 97 views
2

我在看Boost文檔weak_ptrhere並在開始的時候說:boost :: weak_ptr是否會拋出異常?

當最後的shared_ptr對象消失和該對象被刪除 ,試圖從weak_ptr的獲得一個shared_ptr 引用已刪除對象的實例將失敗:構造函數 將拋出boost :: bad_weak_ptr類型的異常,並且 weak_ptr :: lock將返回空的shared_ptr。

都清楚了,到目前爲止,然而,2號線後,它說:

weak_ptr的操作絕不會拋出異常。

每條語句是指什麼?

+2

它是拋出'bad_weak_ptr'的'shared_ptr'(當你嘗試從'weak_ptr'構造它時)。這裏沒有矛盾。 – Greg

回答

2

weak_ptr類的任何操作不會拋出,在內部,當你調用lock()是,它捕獲由構造的shared_ptrbad_weak_ptr)的拋出的異常情況,然後將返回一個空shared_ptr。看看lock()函數的來源,以供自己確認。

+0

'weak_ptr :: lock'從版本1.36開始一直沒有捕獲異常,它現在使用不會拋出的'shared_ptr'構造函數的另一個重載。 – dalle

2

weak_ptr構造shared_ptr可能會拋出bad_weak_ptr異常。 (使用weak_ptr::lock相反,如果你希望能夠來測試這一點。)

任何操作的weak_ptr對象本身不會扔。

1

這意味着如果您在weak_ptr引用的共享實例消失時從weak_ptr構造shared_ptr(template<class Y> explicit shared_ptr(weak_ptr<Y> const & r);),則它將引發異常。

你有兩種方法可以從的weak_ptr獲得的shared_ptr:

  • shared_ptr的構造,它會拋出如果由weak_ptr的引用的實例已經一去不復返了
  • shared_ptr<T> weak_ptr<T>::lock() const;會,如果該實例返回的shared_ptr的空實例weak_ptr引用的內容已消失。
相關問題