1.不要把乙個原生指標給多個shared_ptr管理
int* ptr = new
int;
shared_ptr
p1(ptr);
shared_ptr
p2(ptr); //logic error
//ptr物件被刪除了2次
2.不要把this指標給shared_ptr
class test
private:
shared_ptr
m__sp;
};test* t = new test;
shared_ptr
sp(t);
sp->getself();
//sp物件被刪除了2次
3.shared_ptr作為被保護的物件的成員時,小心因迴圈引用造成無法釋放資源。(解決辦法,可使用weak_ptr)
weak-ptr協助shared_ptr共同協助作用。4.不要在函式實參裡建立shared_ptr
function ( shared_ptr
(new
int), g( ) );
//有缺陷可能的過程是先new int,然後調g(),g()發生異常,shared_ptr沒有建立,int記憶體洩露。
//boost推薦寫法
shared_ptr
p(new
int());
f(p, g());
5.物件內部生成shared_ptr
class
y: public
boost::enable_shared_from_this
>
};//
boost文件說,在呼叫shared_from_this()之前,必須存在乙個正常途徑建立的shared_ptr
boost:
:shared_ptr spy(new y)
boost:
:shared_ptr p = spy->getself(); //
ok
6.物件陣列用shared_array
int* pint = new
int[100];
shared_array p (pint );
//既然shared_ptr對應著delete;顯然需要乙個delete對應物shared_array
7.weak_ptr在使用前需要檢查合法性。
weak_ptrwp;
shared_ptr
sp_null = wp.lock(); //sp_null .use_count()==0;
/*因為上述**中sp和sp_ok離開了作用域,其容納的k物件已經被釋放了。得到了乙個容納null指標的sp_null物件。在使用wp前需要呼叫wp.expired()函式判斷一下。因為wp還仍舊存在,雖然引用計數等於0,仍有某處「全域性」性的儲存塊儲存著這個計數資訊。直到最後乙個weak_ptr物件被析構,這塊「堆」儲存塊才能被**。否則weak_ptr無法直到自己所容納的那個指標資源的當前狀態。*/
8.不要new shared_ptr
本來shared_ptr就是為了管理指標資源的,不要又引入乙個需要管理的指標資源shared_ptr*9.盡量不要get
class b;
class d : public b; //繼承層次關係
shared_ptrsp (new d); //通過隱式轉換,儲存d的指標。
b* b = sp.get(); //shared_ptr辛辛苦苦隱藏的原生指標就這麼被刨出來了。
d* d = dynamic_cast
(b); //這是使用get的正當理由嗎?
//正確的做法
shared_ptrspb (new d) ;
shared_ptr
spd = shared_dynamic_cast(spb); //變成子類的指標
//shared_ptr在竭盡全力表演的像乙個原生指標,原生指標能幹的事,它也基本上能幹。
//另乙個同get相關的錯誤
shared_ptr
sp(new t);
shared_ptr
sp2( sp.get() ) ;//又乙個「二龍治水」例項,指標會刪2次而錯誤。
10.建構函式裡呼叫shared_from_this拋例外
class holder:public enable_shared_from_this
};//同前面條款5,不符合enable_shared_from_this使用前提。
只為記錄,只為分享! 願所寫能對你有所幫助。good good study, day day up!
C 11智慧型指標
本文介紹c 的四種智慧型指標,其中後三種是c 11新增加的,auto ptr已被棄用。要編譯c 11,需要安裝g 4.8 sudo add apt repository ppa ubuntu toolchain r test sudo apt get update sudo apt get inst...
c 11 智慧型指標
如果在程式中使用new從堆 自由儲存區 分配記憶體,等到不需要時,應使用delete將其釋放。c 引入了智慧型指標auto ptr,以幫助自動完成這個過程。c 11摒棄了auto ptr,並新增了三種智慧型指標 unique ptr,shared ptr,weak ptr。一.auto ptr,un...
c 11 智慧型指標
首先來看shared ptr,先貼一小部分vs2013裡的實現 template class shared ptr template class shared ptr public ptr base ty template explicit shared ptr ux px template cla...