C++ 11 深度学习(六)智能指针综述
以下三種智能指針均為類模板
1.shared_ptr? 共享指針? ?,多個指針指向同一個對象,最后一個指針被銷毀時,這個對象會被釋放。
2.week_ptr 是輔助shared_ptr工作的
3.unique_ptr 是獨占式指針,同一時間只能有一個指針能指向該對象,該對象所有權還是可以轉移出去的。
shared_ptr基礎
1.共享所有權,不是被一個shaerd_ptr使用,而是被多個shared_ptr之間相互協作,shared_ptr有額外開銷。
2.工作原理:采用引用計數機制,每個shared_ptr的拷貝都指向相同的內存,所以,只有最后一個指向該內存(對象)的shared_ptr指針不需要再指向對象時,那么shared_ptr才會去析構指向的對象。
3.最后一個指向該內存對象的shared_ptr在什么情況下會釋放該對象?
? a.shared_ptr被析構的時候。?
? b.這個shared_ptr指向其他對象時。
4.格式:shared_ptr<指向的類型>智能指針的名字
//智能指針p1指向new一個int類型的對象,初始值為100shared_ptr<int>p1(new int(100));其中引用計數為1,該指針是一個強引用。?
5.返回值為shared_ptr
shared_ptr<int>makes(int val) {return shared_ptr<int>(new int(val)); }6.裸指針可以初始化智能指針,但是不推薦。
7.shared_ptr<int>p; 指向int的智能指針,名字為p,但目前指向的為空nullptr。'
8.make_shared函數,標準庫里的函數模板,安全高效的分配和使用shared_ptr;它能在內存(堆)中分配并初始化一個對象,然后返回指向對象的shared_ptr。
shared_ptr<int>p1=make_shared<int>(100);9. 把智能指針當作實參向函數里傳遞時,引用計數+1,出函數后引用計數-1。如果傳遞使用引用&,引用計數不會增加,如果有指針來接返回值,引用計數會增加。
10.use_count( )返回多少個智能指針指向某個對象,主要用于調試目的。
?
int i = 0;shared_ptr<int>p1=make_shared<int>(100);i = p1.use_count();//引用計數為1auto p2(p1);//引用計數+1i = p1.use_count();//引用計數為211.unique( ) :是否該智能指針獨占某個指向的對象,也就是若只有一個智能指針指向某個對象,則unique( )返回true,否則返回false。
12.reset( )復位(恢復)
? ?a.reset( )不帶參數時,若智能指針P是唯一指向該對象的指針,則釋放,并置空。若智能指針P不是唯一指向該對象的指針,則引用計數減少1,同時將P置空。
??
shared_ptr<int>p1=make_shared<int>(100);p1.reset();? b.reset( )帶參數時,若智能指針P是唯一指向對象的指針,則釋放并指向新的對象。若P不是唯一的指針,則只減少引用計數,并指向新的對象。
shared_ptr<int>p1=make_shared<int>(100);p1.reset(new int (200));13.get( )返回智能指針中保存的指針(裸指針),delete get出的指針,系統會報告異常。
14.swap( ) 交換兩個智能指針指向的對象。
15.shared_ptr<A[ ]>P(new A[10]) 此定義系統可以自動釋放。
?
week_ptr
1.weak_ptr是輔助shared_ptr工作,(強shared,弱weak)。
2.它是一個類模板,也是一個智能指針,這個智能指針指向一個shared_ptr管理的對象,但是weak_ptr這中指針不控制生命周期。(不會改變引用計數)
3.作用:監視shared_ptr的生命周期,是強引用的擴充(不是獨立的智能指針)。weak_ptr能夠監視到它的指向對象是否存在。
4.weak_ptr的創建,創建weak_ptr的時候,一般是用一個shared_ptr來初始化。強引用計數不會改變,而弱引用計數會改變。
shared_ptr<int>p1=make_shared<int>(100);weak_ptr<int>p2(p1);//P2共享P1,強引用計數不會改變5.lock( )? 是檢查weak_ptr所指向的對象是否存在,如果存在,這個lock返回一個指向shared_ptr,如果不存在則返回一個空的shared_ptr。存在(強引用計數+1)
6.use_count( )獲取與弱指針共享對象的其他shared_ptr數量。
7.expired( )是否過期的意思,若該指針的use_count( )為0,表示該弱指針指向的對象已經不存在,則返回true,用這個函數判斷所觀察的資源是否釋放。
8.reset( )將該指弱指針設置為空,不影響指向該對象的強引用數量,但指向該對象的弱引用計數會減少。
9.weak_ptr 和 shared_ptr是裸指針的2倍。
?
?
unique_ptr
1.同一時刻,只能有一個unique_ptr指針指向這個對象內存。
2.make_unique函數初始化并返回一個unique_ptr。
3.move移動語義,移動完后,p1為空,p2指向原p1所指。
unique_ptr<string>p1(new string("hello"));unique_ptr<string>p2 = std::move(p1);4.release( )? 放棄對指針的控制權,切斷指針與指針對象之間的聯系,返回裸指針。將智能指針(置空),裸指針可手動delete,也可初始化另一個智能指針,或給另一個智能指針賦值。
5.轉成shared_ptr,如果unique_ptr為右值,就可以將它賦值給shared_ptr。因為shared_ptr包含一個顯示構造函數,可適用于將右值unique_ptr轉換為shared_ptr,shared_ptr接管unique_ptr指向的內存對象。
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的C++ 11 深度学习(六)智能指针综述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 11 深度学习(五)类型转换:s
- 下一篇: 水蛭最怕什么 水蛭的天敌是什么