c++11中的智能指針

? ? ? ? 在C++11中有四種智能指針,auto_ptr,shared-ptr,unique_ptr和weak-ptr,其中auto_ptr有許多不足之處,在C++11中已經建議廢棄使用。

1.?shared_ptr

? ??std::shared_ptr智能指針可以通過共享指向對象的所有權,從而實現對對象的動態管理。std::shared_ptr一般不會擁有對象,相反,所有指向對象的std::shared_ptr指針合作起來確保在對象不需要時析構被調用。當最后一個指向對象的std::shared_ptr不再指向該對象時(比如該std::shared_ptr被銷毀或者指向別的對象),這個std::shared_ptr會銷毀它指向的對象。就像垃圾回收一樣,用戶自己不用關心被指向對象的生存周期,同時對析構來說,對象的析構時間是確定的。

? ?一個std::shared_ptr可以通過查詢指向對象的引用計數來得到它是否是最后一個指針,引用計數是一個和資源關聯的值,它記錄了有多少std::shared_ptr指向該資源。std::shared_ptr構造函數中會增加引用計數,析構函數匯總減小引用計數(通常是這樣---見下面),拷貝復制操作兩者都執行。(假如sp1和sp2指向不同的對象,操作“sp1=sp2;”會修改sp1,指向sp2,結果就是原來sp指向的對象的引用計數減少了,同時sp2指向的對象的引用計數增加了。)當一個std::shared_ptr 指針看到對象的引用計數在指向完減一操作后變為0時,那么沒有std::shared_ptr指向該對象了,于是std::shared_ptr將會銷毀它。

2.?unique_ptr

? ? 通常可以認為std::unique_ptr和原始指針有相同的尺寸,并且對于多數操作(包括解引用),它和原始指針有幾乎相同的指令。這意味著你可以在內存和cpu緊張的地方使用它,如果普通的原始指針對你夠快夠用的話,那么std::unique_ptr幾乎也是夠用的。

? ? std::unique_ptr實現了獨享所有權的語義。一個非空的std::unique_ptr總是擁有它所指向的資源。轉移一個std::unique_ptr將會把所有權也從源指針轉移給目標指針(源指針被置空)。拷貝一個std::unique_ptr將不被允許,因為如果你拷貝一個std::unique_ptr,那么拷貝結束后,這兩個std::unique_ptr都會指向相同的資源,它們都認為自己擁有這塊資源(所以都會企圖釋放)。因此std::unique_ptr是一個僅能移動(move_only)的類型。當指針析構時,它所擁有的資源也被銷毀。默認情況下,資源的析構是伴隨著調用std::unique_ptr內部的原始指針的delete操作的。

??std::unique_ptr通常出現兩種形式。一種是單個對象(std::unique_ptr<T>),另一種是數組(std::unique_ptr<T[]>)。標準庫提供了一個可以管理new分配數組的unique_ptr版本,為了用一個unique_ptr管理動態數組,我們必須在對象類型后面跟一對方括號。

unique_ptr<int[]>up(new int[10]);
up.realese();//自動用delete[]銷毀其指針。
當unique_ptr指向數組時我們不能使用點和箭頭運算符,而是用下標來訪問數組中的元素:
for(size_ti=0;i I != 10; ++i)
up[i]=i;
unique_ptr<T[]>u //u指向一個類型為T的動態分配的數組
unique_ptr<T[]>u (p) //u指向內置指針p所指向的動態分配的數組。P必須能轉換為類型T*
u[i] //返回位置i的元素


3.?weak-ptr

? ?有時候,我們需要一個靈巧指針可以像std::shared_ptr一樣方便,但又不參與管理被指對象的所有權。換句話說,需要一個像std::shared_ptr但又不影響對象引用計數的指針。這類指針會有一個std::shared_ptr沒有的問題:被指的對象有可能已經被銷毀。一個良好的靈巧指針應該能處理這種情況,通過跟蹤什么時候指針會懸浮,比如在被指對象不復存在的時候。這正是std::weak_ptr這類型靈巧指針所能做到的。

??weak_ptr是一種不控制所指向對象生存期的智能指針,它指向一個shared_ptr管理的對象。將一個weak_ptr綁定到shared_ptr不會改變shared_ptr的引用計數。一旦最后一個指向對象的shared_ptr被銷毀,對象就會被釋放,即使有weak_ptr指向對象,對象還是會被釋放。
當我們創建一個weak_ptr時,要用一個shared_ptr來初始化它:

auto p=make_shared_ptr<int>(42);
weak_ptr<int>wp(p); //wp弱共享p,p的引用計數未改變

由于對象可能不存在,我們不能使用weak_ptr直接訪問對象,而必須調用lock().此函數檢查weak_ptr指向的對象是否存在。如果存在lock則返回一個指向共享對象的shared_ptr,同時該對象的引用計數會增加。
? ?
if(shared_ptr<int> np= wp.lock())
{
}

? ? ? std::weak_ptr可以和std::shared_ptr 一起解決引用計數的循環引用問題。

? ? ?具體可參考《std::shared_ptr 和 std::weak_ptr的用法以及引用計數的循環引用問題》



參考文獻:

1.?c++11 條款19:使用std::shared_ptr來進行共享所有權的資源管理

2.?c++11 條款20:使用std::weak_ptr作為一個類似std::share_ptr但卻能懸浮的指針

3.?c++11 條款18: 使用std::unique_ptr來進行獨享所有權的資源管理

4.?C++ 智能指針shared-ptr,unique_ptr和weak-ptr

5. ? ?? [C++11]_[初級]_[shared_ptr的使用場景]

6. ? ? ?[C++11]_[初級]_[unique_ptr的使用場景]

7. ? ?? [C++11]_[初級]_[weak_ptr的使用場景]

8. ? ?【C++11新特性】 C++11智能指針之unique_ptr

9. ?? 【C++11新特性】 C++11智能指針之shared_ptr

10 . ?【C++11新特性】 C++11智能指針之weak_ptr


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258779.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258779.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258779.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu14.04設置靜態IP

啊&#xff0c;最近懶惰了&#xff0c;好久沒有寫博客了。 一般機器啟動的時候會自動從DHCP服務器上面獲取動態IP地址&#xff0c;這是一件很方便的事情&#xff0c;可以不用手動設置網絡相關的蠶參數&#xff0c;但是有時候還是需要機器固定IP地址的。 第一步&#xff0c;編輯…

高中學歷python培訓靠譜嗎_高中學歷學完Python就能干人工智能?

最近Python大熱&#xff0c;主要是人工智能的熱度&#xff0c;昨天后院活動部介紹了一位女網友為男朋友選擇Java還是Python&#xff0c;大量的程序員熱議&#xff0c;也有人詢問如何學習Python&#xff0c;比如這位網友詢問高中學歷學習Python是不是就能干人工智能。兄弟&#…

curl+個人證書(又叫客戶端證書)訪問https站點

目前&#xff0c;大公司的OA管理系統&#xff08;俗稱內網&#xff09;&#xff0c;安全性要求較高&#xff0c;通常采用https的雙向 認證模式。 首先&#xff0c;什么是https&#xff0c;簡單的說就是在SSL協議之上實現的http協議&#xff08;get、post等操作&#xff09;。更…

boot.oat FC問題分析報告

【NE現場】 pid: 5252, tid: 5252, name: ndroid.contacts >>> com.android.contacts <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x1458x0 0000000000000000 x1 0000000090d9892c x2 0000000000000001 x3 000000000000012cx4 …

c++ 虛函數的實現機制

轉載自&#xff1a;http://blog.csdn.net/jiangnanyouzi/article/details/3720807 1、c實現多態的方法 其實很多人都知道&#xff0c;虛函數在c中的實現機制就是用虛表和虛指針&#xff0c;但是具體是怎樣的呢&#xff1f;從more effecive c其中一篇文章里面可以知道&#xff…

powerdesigner 技巧

1.修改建表腳本生成規則。如果每個表格都有相同的字段&#xff0c;可以如下修改&#xff1a; Database -> Edit Current DBMS 展開 Script -> Object -> Table -> Create 見右下的Value值&#xff0c;可以直接修改如下&#xff1a;/* tablename: %TNAME% */ create…

勒索病毒攻擊應急防范

北京時間5月12日&#xff0c;互聯網上出現針對Windows操作系統的勒索軟件&#xff08;Wannacry&#xff09;攻擊案例。勒索軟件利用此前披露的Windows SMB服務漏洞&#xff08;對應微軟漏洞公告&#xff1a;MS17-010&#xff09;攻擊手段&#xff0c;向終端用戶進行滲透傳播&am…

C++中虛析構函數的作用

C中的虛析構函數到底什么時候有用的&#xff0c;什么作用呢。 總的來說虛析構函數是為了避免內存泄露&#xff0c;而且是當子類中會有指針成員變量時才會使用得到的。也就說虛析構函數使得在刪除指向子類對象的基類指針時可以調用子類的析構函數達到釋放子類中堆內存的目的&…

蘋果Swift編程語言入門教程【中文版】

http://www.25pp.com/news/news_60984.html轉載于:https://www.cnblogs.com/niaowo/p/4564298.html

python正則表達式匹配aabb_Python正則表達式拆分多個匹配項

我正在嘗試將包含2個不同字符的序列的字符串拆分為多個組.如果我們假設字符是a和b,則用于分組的純文本規則為&#xff1a;>組包含0 a,后跟1 b>后面的所有a都包含在下一組中,除非我們在單詞末尾.例如&#xff1a;處理測試后,目標是分成預期的組.tests [abab,ababab,aabab…

MEF 導入(Import)和導出(Export)

前言&#xff1a; MEF不同于其他IOC容器&#xff08;如&#xff1a;Castle&#xff09;很重要的原因在于它使用了特性化編程模型&#xff08;涉及到兩個概念&#xff1a;“特性”和“編程模型”&#xff09;。 特性&#xff08;Attribute&#xff09;&#xff1a;舉例來說就是我…

Android SimpleAdapter的參數

1.作用是ArrayList和 ListView的橋梁。這個ArrayList里邊的每一項都是一個Map<String,?>類型。 ArrayList當中的每一項 Map對象都和ListView里邊的每一項進行數據綁定一一對應。2.SimpleAdapter的構造函數&#xff1a;SimpleAdapter(Context context, List<? …

JMeter 教程匯總鏈接

http://www.360doc.com/content/14/0318/23/16361380_361732630.shtml 可以作為入門系列教程。 盡管網頁也給出了視頻鏈接&#xff0c;但是我不建議看視頻學習&#xff01; 建議直接看文字&#xff08;可以跳躍式學習&#xff0c;視頻的則是線性學習&#xff09;轉載于:https:…

C++ STL中set底層實現方式

Q&#xff1a;STL中set底層實現方式&#xff1f; 為什么不用hash&#xff1f; A: 第一個問題:set底層實現方式為RB樹&#xff08;即紅黑樹&#xff09;。 第二個問題: 首先set&#xff0c;不像map那樣是key-value對&#xff0c;它的key與value是相同的。關于set有兩種說法&…

python自動獲取天氣_用python獲取天氣數據,并作定時播報

原標題&#xff1a;用python獲取天氣數據&#xff0c;并作定時播報數據挖掘入門與實戰 公眾號&#xff1a; datadw思路1.調用和風天氣的API&#xff0c;獲取天氣數據2.用百度語音API&#xff0c;將天氣數據合成語音3.用樹莓派每天早上定時播報天氣(定時任務crontab Python腳本…

c++實現解析文件路徑

注意&#xff1a;本實現只能解析類似linux下的路徑&#xff0c;即“/data/a.txt”&#xff0c;而不能解析“c:\a.txt” 或者“c:\\a.txt”&#xff0c;但是應該很容易擴展改寫實現此功能。 FilepathParse.h #include <string> using std::string;void parseFilepath(str…

gedit搭建c開發環境

在管理外部工具中&#xff0c;創建啟動腳本 1 #!/bin/sh 2 DIR$GEDIT_CURRENT_DOCUMENT_DIR 3 NAME$GEDIT_CURRENT_DOCUMENT_NAME 4 /home/lxy/code/c/struct/run.sh ${DIR}/${NAME} 創建run.sh #!/bin/sh file$1 ext${file##*.}#C if [ $ext "c" ]; thenif [ -f $f…

Oracle數據庫入門——常用的數據字典

一、oracle數據字典主要由以下幾種視圖構成&#xff1a;1.user視圖以user_為前綴&#xff0c;用來記錄用戶對象的信息 2.all視圖以all_為前綴&#xff0c;用來記錄用戶對象的信息及被授權訪問的對象信息 3.dba視圖以dba_為前綴&#xff0c;用來記錄數據庫實例的所有對象的信息 …

一個excel文檔里復制黏貼另外表單跟著變動_利用Excel連接Power BI,實現PPT報告自動輸出...

?文/HALI就職于汽車行業戰略部門 專注汽車市場信息情報收集和分析因為工作需要&#xff0c;每月周期性的更新數據和撰寫PPT 報告成為繁重的勞動。結果是很多時間花費在數據處理上&#xff0c;真正的分析工作&#xff0c;往往只能草草收場。不能坐以待斃&#xff0c;就要想想有…