C 11的智慧型指標

2021-09-24 09:37:38 字數 2215 閱讀 6267

c++11摒棄了auto_ptr,支援 shared_ptr,unique_ptr,weak_ptr,包含在標頭檔案中。

智慧型指標是利用了一種叫做raii(資源獲取即初始化)的技術對普通的指標進行封裝,用是防止忘記呼叫delete釋放記憶體和程式異常的進入catch塊忘記釋放記憶體。當超出了智慧型指標類的作用域是,類會自動呼叫析構函式,析構函式會自動釋放資源。

shared_ptr多個指標指向相同的物件。shared_ptr使用引用計數,每乙個shared_ptr的拷貝都指向相同的記憶體。每建乙個shared_ptr,內部的引用計數加1,每析構一次,內部的引用計數減1,減為0時,自動刪除所指向的堆記憶體。shared_ptr內部的引用計數是執行緒安全的,但是物件的讀取需要加鎖。

#include #include using namespace std;

int main()

{ int a = 5;

//shared_ptrsp1(new int(5));

shared_ptrsp1 = make_shared(a);

cout<<"*sp1 = "<<*sp1cout<<"*sp2 = "<<*sp2.get()《輸出

*sp1 = 5

use count = 1

*sp2 = 5

use count = 2

use count = 1

某個時刻只能有乙個unique_ptr指向乙個給定物件,由於乙個unique_ptr擁有它指向的物件,因此unique_ptr不支援普通的拷貝或賦值操作。 不可以對unique_ptr進行拷貝、賦值等操作,但是可以通過呼叫release或reset將指標所有權從乙個(非const)unique_ptr轉移給另乙個unique。當unique_ptr被銷毀時,該物件被銷毀。

unique_ptr不像shared_ptr一樣擁有標準庫函式make_shared來建立乙個shared_ptr例項。要想建立乙個unique_ptr,我們需要將乙個new 操作符返回的指標傳遞給unique_ptr的建構函式。

#include #include using namespace std;

int main()

{ unique_ptrup1(new int(5));

cout<<"*up1 = "<<*up1cout<<"*up2 = "<<*up2《輸出

*up1 = 5

up1.get() = 0xf71530

*up2 = 5

up2.get() = 0xf71530

up1.get() = 0

weak_ptr是用來解決shared_ptr相互引用時的死鎖問題,如果兩個shared_ptr相互引用,那麼這兩個指標的引用計數永遠不可能下降為0,資源永遠不會釋放。它是對物件的一種弱引用,不會增加物件的引用計數,和shared_ptr之間可以相互轉化,shared_ptr可以直接賦值給它,因為可能出現weak_ptr所指向的物件實際上已經被釋放了的情況,所以weak_ptr有乙個lock函式,嘗試取回乙個指向物件的shared_ptr。

#include #include using namespace std;

class cb;

class ca

{public:

shared_ptrpb_;

~ca()

{cout<<"delete a"~cb()

{cout<<"delete b"shared_ptrspb(new cb());

spa->pb_ = spb;

spb->pa_ = spa;

cout《得到輸出結果:

22

因為互相引用,兩個資源的引用計數都為2,當超出作用範圍時,智慧型指標spa,spb析構時兩個資源引用計數會減一,但是兩者引用計數還是為1,導致跳出函式時資源沒有被釋放(a b的析構函式沒有被呼叫)。

如果把其中乙個改為weak_ptr,如把類b裡面的shared_ptrpa_改為

weak_ptrpa_;
執行結果如下

2

1delete a

delete b

a的引用開始就只有1,當spa析構時,a的計數變為0,a得到釋放,a釋放的同時也會使b的計數減一,同時spb析構時使b的計數減一,那麼b的計數為0,b得到釋放。如果是把a裡面的改為weak_ptr,就會發現是b先析構。

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