C 11智慧型指標

2021-06-20 03:16:02 字數 2809 閱讀 7129

本文介紹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,而且無法過載,所以不能支援陣列等物件。

class

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

unique_ptr詳細請參考這裡

由於auto_ptr存在各種問題,c++11中unique_ptr華麗登場替換了auto_ptr,它們所做的事情基本一樣,不過unique_ptr不支援複製語義,只支援移動語義,所以無法執行普通的複製或賦值操作(返回將要被銷毀的unique_ptr時例外),但是可以進行移動構造賦值操作,說白了就是複製的話需要顯示move。另外unique_ptr可以過載刪除器,使其支援陣列等型別。

unique_ptrptr1(new a(1

));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詳細請參考這裡

通常概念下的智慧型指標指的是shared_ptr,它允許共享資源,使用引用計數記錄資源被幾個指標共享。呼叫release(),析構函式或者被複製賦值時,原來管理的資源的引用計數都會減1,計數為0時釋放資源。

shared_ptrptr1(new a(1

));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);

weak_ptr詳細請參考這裡

使用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...