本文介紹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 instal gcc-4.8
sudo apt-get install g++-4.8
編譯時指定標準:
g++-4.8 -std=c++11
auto_ptr詳細請參考這裡
auto_ptr是為了推動raii而加入到c++標準的第乙個智慧型指標,它實現了最基本的資源管理,不過與其他型別不同的是,auto_ptr是沒有複製語義的,它在複製時實現的其實是移動語義,複製和賦值auto_ptr時會預設改變所管理資源的所有權,基於這個原因,它也不能在stl容器中使用,因為容器內的元素必需支援可複製和可賦值。另外還有乙個限制它使用範圍的因素是它的析構函式預設呼叫delete,而且無法過載,所以不能支援陣列等物件。
classunique_ptr詳細請參考這裡a
~a()
int getvalue()
private
:
intival;
};auto_ptr
ptr1(new a(1
));auto_ptr
ptr2(new a(2
));assert(ptr1->getvalue()==1
);assert(ptr2->getvalue()==2
);ptr1 =ptr2;
assert(ptr2.
get ()==null); //
now ptr2 is null
由於auto_ptr存在各種問題,c++11中unique_ptr華麗登場替換了auto_ptr,它們所做的事情基本一樣,不過unique_ptr不支援複製語義,只支援移動語義,所以無法執行普通的複製或賦值操作(返回將要被銷毀的unique_ptr時例外),但是可以進行移動構造賦值操作,說白了就是複製的話需要顯示move。另外unique_ptr可以過載刪除器,使其支援陣列等型別。
unique_ptrptr1(new a(1shared_ptr詳細請參考這裡));unique_ptr
ptr2(new a(2
));ptr1 = ptr2; //
error
ptr1 = move(ptr2); //
right, ptr2 is null
assert(ptr2==null)
unique_ptr
ptr3(new a[2]); //
array
assert(ptr3[0].getvalue()==3
);assert(ptr3[
1].getvalue()==4);
通常概念下的智慧型指標指的是shared_ptr,它允許共享資源,使用引用計數記錄資源被幾個指標共享。呼叫release(),析構函式或者被複製賦值時,原來管理的資源的引用計數都會減1,計數為0時釋放資源。
shared_ptrptr1(new a(1weak_ptr詳細請參考這裡));shared_ptr
ptr2(new a(2
));assert(ptr1->getvalue()==1
);assert(ptr1.use_count()==1
);assert(ptr2->getvalue()==2
);assert( ptr2.use_count())==1
);ptr1 =ptr2;
assert(ptr1.use_count()==2
)assert(ptr2.use_count()==2
)assert(ptr1->getvalue()==2
);assert(ptr2->getvalue()==2);
使用shared相互引用時會出現資源無法釋放的情況,比如:
class引用如下b;class
a
};class
b
};shared_ptrpb(new
b());
shared_ptr
pa(new
a());
pb->pa_value =pa;
pa->pb_value =pb;
assert(pa.use_count()==2
)assert(pb.use_count()==2)
當pa,pb析構後,引用計數都等於1,資源不會釋放。解決方法是將pa_value和pb_value中任意乙個宣告為 weak_ptr型別。
week_ptr是對物件的一種弱引用,它不會增加物件的引用計數。week_ptr和shared_ptr之間可以相互轉換,shared_ptr可以直接賦值給week_ptr,week_ptr可通過呼叫lock函式來獲得shared_ptr(如果物件已經被釋放,則返回乙個空的shared_ptr)。
weak_ptrpa_value;修改後pb->pa_value=pa 不會增加pa的計數,pa計數為1,離開作用域後計數為0,pa正常釋放,於是pb計數也會減為0,正常釋放。
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...
C 11 智慧型指標
c 11中有unique ptr shared ptr與weak ptr等智慧型指標 smart pointer 定義在 memory 中。可以對動態資源進行管理,保證任何情況下,已構造的物件最終會銷毀,即它的析構函式最終會被呼叫。unique ptr持有對物件的獨有權,同一時刻只能有乙個uniqu...