c++有4個智慧型指標,auto_ptr,shared_ptr,weak_ptr,unique_ptr,其中auto_ptr只有c++98支援,c++11已經棄用。
為什麼要使用智慧型指標?
當申請的空間在函式結束時未進行釋放時,會造成記憶體洩漏;
使用智慧型指標可以避免記憶體洩漏;智慧型指標是乙個類,用於管理乙個指標,當超出了類的作用域時,會自動呼叫析構函式,自動釋放記憶體空間。
auto_ptr:
auto_ptr採用所有權模式。
1 auto_ptr p1(newstring ("
hello
") ;
2 auto_ptrp2; 34
//p2剝奪了p1的所有權5//
當後續訪問p1時將會出錯
6 p2 = p1;
unique_ptr:
unique_ptr能夠實現獨佔式擁有,保證只有乙個智慧型指標指向該物件;能夠避免記憶體洩漏;用於替換auto_ptr。
1 unique_ptr p1 (newstring ("
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(newstring ("
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;
1string *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相互引用時的死鎖問題。
1class 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得到釋放。
voidfun()
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 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...