日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

C++智能指針enable_shared_from_this

來源: 責(zé)編: 時(shí)間:2023-11-17 17:14:06 294觀看
導(dǎo)讀enable_shared_from_this介紹enable_shared_from_this其實(shí)是智能指針中的內(nèi)容,它的作用就是用于在類的內(nèi)部,返回一個(gè)this的智能指針。對(duì)于enable_shared_from_this,初學(xué)者可能不明白它的使用場(chǎng)景和使用的必要性,可能有得

6Ys28資訊網(wǎng)——每日最新資訊28at.com

enable_shared_from_this介紹

enable_shared_from_this其實(shí)是智能指針中的內(nèi)容,它的作用就是用于在類的內(nèi)部,返回一個(gè)this的智能指針。6Ys28資訊網(wǎng)——每日最新資訊28at.com

對(duì)于enable_shared_from_this,初學(xué)者可能不明白它的使用場(chǎng)景和使用的必要性,可能有得童鞋們會(huì)問既然有了this這個(gè)指向自己的指針, 為什么還需要enable_shared_from_this這個(gè)東西呢,直接用this代替不就好了嗎?6Ys28資訊網(wǎng)——每日最新資訊28at.com

我們來看看以下代碼例子,如果先不運(yùn)行,你能看出什么問題嗎?6Ys28資訊網(wǎng)——每日最新資訊28at.com

#include <iostream>class Person{public:    Person() = default;    ~Person(){    };    std::shared_ptr<Person> getPtr(){        return std::shared_ptr<Person>(this);    }};int main() {    std::shared_ptr<Person> person = std::make_shared<Person>();    std::shared_ptr<Person> person1 = person->getPtr();    std::cout << "person.use_count() = " << person.use_count() << std::endl;    std::cout << "person1.use_count() = " << person1.use_count() << std::endl;    return 0;}

以上代碼運(yùn)行崩潰報(bào)錯(cuò)了,這是為什么呢?6Ys28資訊網(wǎng)——每日最新資訊28at.com

6Ys28資訊網(wǎng)——每日最新資訊28at.com

崩潰信息6Ys28資訊網(wǎng)——每日最新資訊28at.com

這是因?yàn)橹挥幸粋€(gè)Person的指針,但是卻被兩個(gè)智能指針shared_ptr持有,而它們的引用計(jì)數(shù)都是1,因此當(dāng)main函數(shù)運(yùn)行完畢后兩個(gè)智能指針釋放時(shí)都對(duì)同一個(gè)Person指針進(jìn)行釋放導(dǎo)致的崩潰。6Ys28資訊網(wǎng)——每日最新資訊28at.com

如果我們能讓兩個(gè)智能指針shared_ptr共享同一個(gè)引用計(jì)數(shù),那么這個(gè)崩潰問題就迎刃而解了。而通過讓Person繼承基類enable_shared_from_this,然后在函數(shù)getPtr中 調(diào)用基類的shared_from_this就能返回一個(gè)this的智能指針,這樣即可實(shí)現(xiàn)讓多個(gè)智能指針共享同一個(gè)引用計(jì)數(shù),而達(dá)到銷毀時(shí)只釋放一次的目的。這就是enable_shared_from_this存在的必要性, 這也是this無法替代的功能點(diǎn)。6Ys28資訊網(wǎng)——每日最新資訊28at.com

如下是實(shí)例代碼:6Ys28資訊網(wǎng)——每日最新資訊28at.com

#include <iostream>class Person:public std::enable_shared_from_this<Person>{public:    Person() = default;    ~Person(){    };    std::shared_ptr<Person> getPtr(){        return shared_from_this();    }};int main() {    std::shared_ptr<Person> person = std::make_shared<Person>();    std::shared_ptr<Person> person1 = person->getPtr();    std::cout << "person.use_count() = " << person.use_count() << std::endl;    std::cout << "person1.use_count() = " << person1.use_count() << std::endl;    return 0;}

通過運(yùn)行調(diào)試打印,我們可以看到這person和person1這兩個(gè)智能指針的引用計(jì)數(shù)都變?yōu)榱?,這是正確的。6Ys28資訊網(wǎng)——每日最新資訊28at.com

6Ys28資訊網(wǎng)——每日最新資訊28at.com

通過兩個(gè)實(shí)例代碼的對(duì)比,我們可以發(fā)現(xiàn)問題的根源所在就是我們?cè)诜祷豻his的智能指針時(shí),直接調(diào)用std::shared_ptr構(gòu)造函數(shù)傳入裸指針的方式構(gòu)造一個(gè)智能指針, 而在之前的介紹中我們提到過使用智能指針shared_ptr時(shí)盡量使用std::make_shared進(jìn)行智能指針的構(gòu)造,避免直接調(diào)用std::shared_ptr構(gòu)造函數(shù)傳入裸指針的方式進(jìn)行構(gòu)造。6Ys28資訊網(wǎng)——每日最新資訊28at.com

更多關(guān)于enable_shared_from_this的實(shí)踐對(duì)比可以參照官網(wǎng)學(xué)習(xí):https://en.cppreference.com/w/cpp/memory/enable_shared_from_this6Ys28資訊網(wǎng)——每日最新資訊28at.com

enable_shared_from_this的實(shí)現(xiàn)

我們通過源碼的方式來分析下enable_shared_from_this的實(shí)現(xiàn)原理,enable_shared_from_this的源碼非常簡(jiǎn)短:6Ys28資訊網(wǎng)——每日最新資訊28at.com

template<class _Tp>class _LIBCPP_TEMPLATE_VIS enable_shared_from_this{    mutable weak_ptr<_Tp> __weak_this_;protected:    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR    enable_shared_from_this() _NOEXCEPT {}    _LIBCPP_INLINE_VISIBILITY    enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {}    _LIBCPP_INLINE_VISIBILITY    enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT        {return *this;}    _LIBCPP_INLINE_VISIBILITY    ~enable_shared_from_this() {}public:    _LIBCPP_INLINE_VISIBILITY    shared_ptr<_Tp> shared_from_this()        {return shared_ptr<_Tp>(__weak_this_);}    _LIBCPP_INLINE_VISIBILITY    shared_ptr<_Tp const> shared_from_this() const        {return shared_ptr<const _Tp>(__weak_this_);}#if _LIBCPP_STD_VER > 14    _LIBCPP_INLINE_VISIBILITY    weak_ptr<_Tp> weak_from_this() _NOEXCEPT       { return __weak_this_; }    _LIBCPP_INLINE_VISIBILITY    weak_ptr<const _Tp> weak_from_this() const _NOEXCEPT        { return __weak_this_; }#endif // _LIBCPP_STD_VER > 14    template <class _Up> friend class shared_ptr;};

通過源碼我們可以發(fā)現(xiàn)這是一個(gè)模版類,將自身類型以模版參數(shù)的形式傳入到父類,這是典型的CRTP應(yīng)用,關(guān)于CRTP之前我們已經(jīng)介紹過了,這里不再累贅。感興趣的童鞋們可以參考之前的博文:6Ys28資訊網(wǎng)——每日最新資訊28at.com

C++之CRTP的使用

enable_shared_from_this對(duì)外只提供了一個(gè)weak_from_this公共方法,其內(nèi)部通過以為弱引用的智能指針weak_ptr構(gòu)造了一個(gè)shared_ptr,這里并沒有什么問題, 問題這個(gè)弱引用的智能指針__weak_this_它是在哪里初始化的呢?我們通shared_ptr的構(gòu)造函數(shù)可以發(fā)現(xiàn),如果傳入的weak_ptr沒有初始化的話是會(huì)拋出異常崩潰的。6Ys28資訊網(wǎng)——每日最新資訊28at.com

其實(shí)成員變量__weak_this_的初始化是在類的外部進(jìn)行初始化的,它的奧秘就是源碼的倒數(shù)第二行template ();改為不使用智能指針, 而使用裸指針的方式,修改為 auto person = new Person;,同時(shí)注釋掉第16行再運(yùn)行是會(huì)崩潰的,這就是因?yàn)開_weak_this_沒有進(jìn)行初始化的原因。6Ys28資訊網(wǎng)——每日最新資訊28at.com

6Ys28資訊網(wǎng)——每日最新資訊28at.com

崩潰信息6Ys28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-27970-0.htmlC++智能指針enable_shared_from_this

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Python系列:如何提高python程序代碼的健壯性

下一篇: C++中的低級(jí)內(nèi)存操作

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 對(duì)標(biāo)蘋果的靈動(dòng)島 華為帶來實(shí)況窗功能

    繼蘋果的靈動(dòng)島之后,華為也在今天正式推出了“實(shí)況窗”功能。據(jù)今天鴻蒙OS 4.0的現(xiàn)場(chǎng)演示顯示,華為的實(shí)況窗可以更高效的展現(xiàn)出實(shí)時(shí)通知,比如鎖屏上就能看到外賣、打車、銀行
  • 6月安卓手機(jī)性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經(jīng)正式過去了,我們也迎來了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發(fā)布之前,性能榜的榜單大體會(huì)以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領(lǐng)先
  • Automa-通過連接塊來自動(dòng)化你的瀏覽器

    1、前言通過瀏覽器插件可實(shí)現(xiàn)自動(dòng)化腳本的錄制與編寫,具有代表性的工具就是:Selenium IDE、Katalon Recorder,對(duì)于簡(jiǎn)單的業(yè)務(wù)來說可快速實(shí)現(xiàn)自動(dòng)化的上手工作。Selenium IDEKat
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對(duì)Reader和Writer接口的組合,
  • 如何使用JavaScript創(chuàng)建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經(jīng)瀏覽過購(gòu)物網(wǎng)站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區(qū)域,以便瀏覽。結(jié)合這個(gè)小小的重要功能可以大大改善您網(wǎng)站的用戶體驗(yàn)
  • Temu起訴SHEIN,跨境電商戰(zhàn)事升級(jí)

    來源 | 伯虎財(cái)經(jīng)(bohuFN)作者 | 陳平安日前據(jù)外媒報(bào)道,拼多多旗下跨境電商平臺(tái)Temu正對(duì)競(jìng)爭(zhēng)對(duì)手SHEIN提起新訴訟,訴狀稱Shein&ldquo;利用市場(chǎng)支配力量強(qiáng)迫服裝廠商與之簽訂獨(dú)家
  • 攜眾多高端產(chǎn)品亮相ChinaJoy,小米帶來一場(chǎng)科技與人文的視聽盛宴

    7月28日,全球數(shù)字娛樂領(lǐng)域最具知名度與影響力的年度盛會(huì)中國(guó)國(guó)際數(shù)碼互動(dòng)娛樂展覽會(huì)(簡(jiǎn)稱ChinaJoy)在上海新國(guó)際博覽中心盛大開幕。作為全球領(lǐng)先的科
  • iQOO Neo8 Pro評(píng)測(cè):旗艦雙芯加持 最強(qiáng)性能游戲旗艦

    【Techweb評(píng)測(cè)】去年10月,iQOO推出了一款Neo7手機(jī),該機(jī)搭載了聯(lián)發(fā)科天璣9000+,配備獨(dú)顯芯片Pro+,帶來了同價(jià)位段最佳的游戲體驗(yàn),一經(jīng)上市便受到了諸多用
  • 北京:科技教育體驗(yàn)基地開始登記

      北京“科技館之城”科技教育體驗(yàn)基地登記和認(rèn)證工作日前啟動(dòng)。首批北京科技教育體驗(yàn)基地?cái)M于2023年全國(guó)科普日期間掛牌,后續(xù)還將開展常態(tài)化登記?! ”本┛萍冀逃w驗(yàn)基
Top 主站蜘蛛池模板: 兰西县| 鄂托克旗| 潼南县| 道孚县| 米泉市| 元朗区| 鞍山市| 绍兴市| 永兴县| 石狮市| 山阴县| 张北县| 青阳县| 清水县| 郴州市| 闽清县| 晋江市| 平谷区| 石城县| 峨眉山市| 曲阳县| 青浦区| 邻水| 开化县| 池州市| 思南县| 青神县| 广宁县| 长宁县| 沾化县| 大渡口区| 伊宁县| 伊春市| 噶尔县| 海阳市| 图木舒克市| 高陵县| 大理市| 临夏县| 团风县| 亳州市|