日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 11 深度学习(六)智能指针综述

發布時間:2023/12/3 c/c++ 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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();//引用計數為2

11.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 深度学习(六)智能指针综述的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。