C++ weak pointer

智能指針根據指向對象的指針個數是否爲0判斷是否釋放對象。該過程是在指針調用析構函數的時候發生,可見智能指針本質上也是一個對象。一個具備指針特性的對象。析構時默認調用delete進行對象的釋放,若是建立的是一些特別的對象,好比數組,鏈接等,必須在建立智能指針時提供一個刪除器。shared_ptr定製刪除器: shared_ptr<type> ptr_obj( new type(), deleter); unique定製刪除器須要使用模板:unique_ptr<type, decltype(deleter)*> ptr_obj(new type(), deleter);數組

  1. C++ 11提出了弱引用的概念,與strong reference(shared_ptr)相對的一個概念。使用的類型爲:boost::weak_ptr.函數

  2. weak_ptr首先是一個模板,其次是沒法直接訪問對象,使用時必須將其轉換成shared_ptr,最後這種指針的個數並不會影響對象的自動釋放(不會影響對象的 引用計數)。指針

  3. 如何使用weak_ptr: 兩種方法,一種是使用構造函數,另外一種是使用weak_ptr::lock方法。第二種比較經常使用。若是對象已經被釋放,兩種方法使用weak_ptr訪問對象分別會返回異常boost::bad_weak_ptr和空的shared_ptr。另外weak_ptr的unique和reset會結合使用。code

shared_ptr<int> p(new int(6));
weak_ptr<int> q = p;
//other function
if(shared_ptr<int> r = q.lock()){
    //do something
}else{
    //do other
}

4.    weak_ptr的特性與shared_ptr的最大的區別在於兩點,一是weak_ptr沒法直接訪問對象,二是weak_ptr不會對對象的釋放產生影響。那麼,何時須要使用weak_ptr呢?考慮下面一個場景,進程從隊列中讀取數據,通過一系列操做以後,發送迴應給這個隊列。進程須要hold隊列的引用。爲了防止隊列提早destroy。可使用shared_ptr.可是若是處理時間比較長,此時隊列可能早就再也不使用,被close了,那麼,可能會嚴重的推遲隊列的釋放,此時能夠用weak_ptr保存上述引用。orm

shared_ptr<queue> q;
struct{
    weak_ptr<queue> q;
    //other information about message
}MessageType;
MessageType m;
m=q->Get();
m.q = q;
....
....
....
if(shared_ptr<queue> r = m.q.lock()){
    r.send(data);
}
相關文章
相關標籤/搜索