智能指針

關(guān)鍵點(diǎn)##

RAII機(jī)制

C++操作符重載

參考鏈接##

C++11智能指針之unique_ptr

shared_ptr

shared_ptr的幾點(diǎn)注意點(diǎn)

智能指針weak_ptr

cpluscplus

unique_ptr智能指針##

生命周期###

unique_ptr生命周期,與普通的數(shù)據(jù)類型相同,一旦離開(kāi)作用域,如果其指向?qū)ο螅?br> 就會(huì)將指向的對(duì)象進(jìn)行銷毀。

unique_ptr特點(diǎn)在于其“獨(dú)占”的特點(diǎn),同一時(shí)刻
unique_ptr指向的對(duì)象只能有一個(gè)引用,不能存在多個(gè)unique_ptr指向同一個(gè)對(duì)象

基本操作###

//后期綁定
unique_ptr<int> ui;
ui.reset(new int(1));
//創(chuàng)建時(shí)動(dòng)態(tài)綁定
unique_ptr<int> ui2(new int(1));
//釋放所有權(quán)
int* pi = ui2.release();
//轉(zhuǎn)移所有權(quán)
unique_ptr<string> us(new string("abc"));
unique_ptr<string> us2 = std::move(us);
//主動(dòng)銷毀
us2 = nullptr

shared_ptr##

生命周期###

shared_ptr生命周期在離開(kāi)作用域時(shí),會(huì)將其指向?qū)ο蟮囊糜?jì)數(shù)減一,
如果發(fā)現(xiàn)引用計(jì)數(shù)已經(jīng)歸〇,那么將會(huì)把其引用的對(duì)象進(jìn)行進(jìn)行銷毀。

shared_ptr的特點(diǎn)在于“引用計(jì)數(shù)”,每當(dāng)有一個(gè)shared_ptr
指針指向相同的對(duì)象的時(shí)候,將會(huì)把引用計(jì)數(shù)增加1,每當(dāng)指向?qū)ο蟮膕hared_ptr被銷毀時(shí),
將會(huì)把引用計(jì)數(shù)減少1,當(dāng)引用計(jì)數(shù)減少為0時(shí),將會(huì)把對(duì)象銷毀。

基本操作

//創(chuàng)建的時(shí)動(dòng)態(tài)綁定
shared_ptr<int> sp(new int(10));
//通過(guò)拷貝
shared_ptr<int> sp1 = sp;
//停止引用對(duì)象
sp.reset();
//銷毀釋放
sp1 = nullptr;

注意###

由于其使用引用計(jì)數(shù)的方式進(jìn)行引用對(duì)象的釋放,所以可能存在環(huán)狀鏈?zhǔn)浇Y(jié)構(gòu)造成內(nèi)存的泄露。
這種時(shí)候需要使用另一個(gè)智能指針weak_ptr解決這種情況。c++無(wú)法想java那樣自動(dòng)判斷并
釋放環(huán)狀鏈?zhǔn)浇Y(jié)構(gòu),所以在使用上還是得需要小心處理。

由于其內(nèi)部加減引用計(jì)數(shù)不是線程安全,所以在多線程使用時(shí)需要自己添加加鎖操作以保證
其引用計(jì)數(shù)的正確性。

weak_ptr##

生命周期###

嚴(yán)格來(lái)說(shuō),weak_ptr并不像shared_ptr以及unique_ptr一樣存在生命周期這總說(shuō)法,因?yàn)?br> 其內(nèi)部不進(jìn)行引用對(duì)象的釋放,也無(wú)法直接進(jìn)行引用對(duì)象的解引用以及->操作。其如果需要
進(jìn)行引用對(duì)象的操作,需要使用lock函數(shù)獲取一個(gè)shared_ptr指針,然后性shared_ptr一
樣進(jìn)行使用。

weak_ptr的特點(diǎn)在于“輔助”shared_ptr指針的使用,其最大
的作用在于解決shared_ptr環(huán)狀引用的問(wèn)題。

基本操作

//引用對(duì)象
shared_ptr<int> sp(new int(1));
weak_ptr<int> wp(sp);
//判斷是否失效
if (wp.expired())
{
    //未失效
    //獲取一個(gè)Shared_ptr對(duì)象進(jìn)行使用
    shared_ptr<int> sp1 = wp.lock();
    *sp1 = 0;
}
else
{
    //已經(jīng)失效
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原作者:Babu_Abdulsalam 本文翻譯自CodeProject,轉(zhuǎn)載請(qǐng)注明出處。 引入### Ooops...
    卡巴拉的樹(shù)閱讀 30,363評(píng)論 13 74
  • 1. 什么是智能指針? 智能指針是行為類似于指針的類對(duì)象,但這種對(duì)象還有其他功能。 2. 為什么設(shè)計(jì)智能指針? 引...
    MinoyJet閱讀 709評(píng)論 0 1
  • 導(dǎo)讀## 最近在補(bǔ)看《C++ Primer Plus》第六版,這的確是本好書(shū),其中關(guān)于智能指針的章節(jié)解析的非常清晰...
    小敏紙閱讀 2,086評(píng)論 1 12
  • 專屬所有權(quán):unique_ptr 我們大多數(shù)場(chǎng)景下用到的應(yīng)該都是 unique_ptr。 unique_ptr 代...
    wayyyy閱讀 1,299評(píng)論 0 1
  • C++智能指針 原文鏈接:http://blog.csdn.net/xiaohu2022/article/deta...
    小白將閱讀 6,995評(píng)論 2 21

友情鏈接更多精彩內(nèi)容