C 智慧型指標

2022-06-25 10:24:13 字數 3228 閱讀 1191

c++有4個智慧型指標,auto_ptr,shared_ptr,weak_ptr,unique_ptr,其中auto_ptr只有c++98支援,c++11已經棄用。

為什麼要使用智慧型指標?

當申請的空間在函式結束時未進行釋放時,會造成記憶體洩漏;

使用智慧型指標可以避免記憶體洩漏;智慧型指標是乙個類,用於管理乙個指標,當超出了類的作用域時,會自動呼叫析構函式,自動釋放記憶體空間。

auto_ptr:

auto_ptr採用所有權模式。

1 auto_ptr p1(new

string ("

hello

") ;

2 auto_ptrp2; 34

//p2剝奪了p1的所有權5//

當後續訪問p1時將會出錯

6 p2 = p1;

unique_ptr:

unique_ptr能夠實現獨佔式擁有,保證只有乙個智慧型指標指向該物件;能夠避免記憶體洩漏;用於替換auto_ptr。

1 unique_ptr p1 (new

string ("

hello

");

2 unique_ptrp2;34

//出錯,p1獨佔擁有new的物件5//

避免了auto_ptr中,p1不再指向有效資料的問題

6 p2= p1;

當程式將乙個unique_ptr物件賦值給另乙個unique_ptr物件時,如果源unique_ptr物件已經存在,則不能編譯通過;如果源unique_ptr物件是乙個臨時右值,可以編譯通過;

1 unique_ptr p1(new

string ("

hello

"));

2 unique_ptrp2;34

//不可以編譯通過5//

將乙個已經存在的p1賦值給p2,會留下懸掛的p1

6 p2 =p1;

78 unique_ptrp3;9//

可以編譯通過

10//

將乙個臨時右值賦值給p3,不會留下懸掛的指標

11 p3 = unique_ptr(new

string ("

world

"));

將臨時右值賦值給p3時,呼叫unique_ptr的建構函式建立乙個臨時物件

unique_ptr(new string ("world")),其所有權讓給p3之後,會自動銷毀,所以不會留下懸掛的指標。

shared_ptr:

shared_ptr能夠實現共享式擁有,多個智慧型指標可以指向相同的物件,該資源會在最後乙個引用被銷毀的時候(計數等於0時)釋放,使用計數機制來表示物件被幾個智慧型指標所共享;shared_ptr物件可以通過new來構造,也可以通過傳入unique_ptr和weak_ptr來構造。

shared_ptr的成員函式:

use_count()-返回引用計數的個數;

unique()-返回是否獨佔式擁有;

swap()-交換兩個智慧型指標所指向的物件;

release()-當前指標釋放資源所有權,計數減1;

1

string *s1 = new

string("

hello");

2 shared_ptrps1(s1);

3 shared_ptrps2;

4 ps2 =ps1;56

//use_count(),返回引用計數的個數7//

輸出2,共有兩個智慧型指標ps1和ps2指向字串"hello"

8 cout << ps1.use_count()<9 cout << ps2.use_count()<1011

//unique(),返回ps1是否獨佔式擁有物件

12//

輸出0,ps1和ps2共享物件

13 cout << ps1.unique()<14

15string *s3 = new

string("

world");

16 shared_ptrps3(s3);

17//

交換ps1和ps3所擁有的物件

18swap(ps1, ps3);

1920

//輸出1,只有乙個智慧型指標ps1指向字串"world"

21 cout << ps1.use_count()<22//

輸出2,共有兩個智慧型指標ps2和ps3指向字串"hello"

23 cout << ps2.use_count() <2425

//當前指標ps2釋放資源所有權,計數減一

26ps2.release();

27//

輸出1,只有乙個智慧型指標ps3指向字串"hello"

28 cout << ps2.use_count() << endl;

weak_ptr:

weak_ptr是一種不控制物件生命週期的智慧型指標,指向乙個shared_ptr管理的物件;weak_ptr是一種弱引用,不會增加物件的引用計數,只提供對該物件的訪問手段;而shared_ptr是一種強引用,會增加物件的引用計數,對該物件進行記憶體管理;

weak_ptr用來解決shared_ptr相互引用時的死鎖問題。

1

class b; //宣告2

3classa4

;89classb10

;1415void

fun()

1632

33int

main()

34

pa和pb之間相互引用,兩個資源的引用計數均為2;當跳出fun函式時,智慧型指標pa和pb析構,兩個資源的引用計數均變為1,兩個資源沒有被釋放(類a和類b的析構函式沒有被呼叫),造成死鎖。

當把類a中的shared_ptr改為weak_ptr後,資源a的引用計數為2,資源b的引用計數為1;當跳出fun函式時,智慧型指標pa和pb析構,資源a的引用計數變為1,資源b的引用計數變為0,資源b釋放;資源b釋放以後,是的資源a的引用計數變為0,資源a得到釋放。

void

fun()

shared_ptr和weak_ptr之間可以相互轉換,shared_ptr可以直接賦值給weak_ptr,weak_ptr通過呼叫lock函式轉換為shared_ptr從而賦值給shared_ptr;此外,不能通過weak_ptr直接訪問物件的方法,應該先把其轉換為shared_ptr以後再進行訪問。

相關鏈結

c++型別轉換 

c 智慧型指標

auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...

c 智慧型指標

很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...

c 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...