chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

std::enable_shared_from_this使用場(chǎng)景

5jek_harmonyos ? 來(lái)源:編程學(xué)習(xí)總站 ? 作者:寫(xiě)代碼的牛頓 ? 2021-08-04 15:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

std::enable_shared_from_this使用場(chǎng)景

在很多場(chǎng)合,經(jīng)常會(huì)遇到一種情況,如何安全的獲取對(duì)象的this指針,一般來(lái)說(shuō)我們不建議直接返回this指針,可以想象下有這么一種情況,返回的this指針保存在外部一個(gè)局部/全局變量,當(dāng)對(duì)象已經(jīng)被析構(gòu)了。

但是外部變量并不知道指針指向的對(duì)象已經(jīng)被析構(gòu)了,如果此時(shí)外部使用了這個(gè)指針就會(huì)發(fā)生程序奔潰。既要像指針操作對(duì)象一樣,又能安全的析構(gòu)對(duì)象,很自然就想到,智能指針就很合適!

那么智能指針如何使用呢?現(xiàn)在我們來(lái)看一段代碼。

#include 《iostream》 #include 《memory》 class Widget{ public: Widget(){ std::cout 《《 “Widget constructor run” 《《 std::endl; } ~Widget(){ std::cout 《《 “Widget destructor run” 《《 std::endl; } std::shared_ptr《Widget》 GetSharedObject(){ return std::shared_ptr《Widget》(this); } }; int main() { std::shared_ptr《Widget》 p(new Widget()); std::shared_ptr《Widget》 q = p-》GetSharedObject(); std::cout 《《 p.use_count() 《《 std::endl; std::cout 《《 q.use_count() 《《 std::endl; return 0; }

編譯運(yùn)行后程序輸出如下:

Widget constructor run 1 1 Widget destructor run Widget destructor run 22:06:45: 程序異常結(jié)束。

從輸出我們可以看到,調(diào)用了一次構(gòu)造函數(shù),卻調(diào)用了兩次析構(gòu)函數(shù),很明顯這是不正確的。而std::enable_shared_from_this正是為了解決這個(gè)問(wèn)題而存在。

02

std::enable_shared_from_this原理和實(shí)戰(zhàn)

前面我們說(shuō)使用std::enable_shared_from_this能解決安全獲取this指針的問(wèn)題。在使用之前,我們先來(lái)了解下std::enable_shared_from_this是什么?為什么能解決這個(gè)問(wèn)題?std::enable_shared_from_this定義如下:

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; };

std::enable_shared_from_this是模板類,內(nèi)部有個(gè)_Tp類型weak_ptr指針,調(diào)用shared_from_this成員函數(shù)便可獲取到_Tp類型智能指針,從這里可以看出,_Tp類型就是我們的目標(biāo)類型。

再來(lái)看看std::enable_shared_from_this的構(gòu)造函數(shù)都是protected,因此不能直接創(chuàng)建std::enable_from_shared_from_this類的實(shí)例變量,只能作為基類使用。因此使用方法如下代碼所示:

#include 《iostream》 #include 《memory》 class Widget : public std::enable_shared_from_this《Widget》{ public: Widget(){ std::cout 《《 “Widget constructor run” 《《 std::endl; } ~Widget(){ std::cout 《《 “Widget destructor run” 《《 std::endl; } std::shared_ptr《Widget》 GetSharedObject(){ return shared_from_this(); } }; int main() { std::shared_ptr《Widget》 p(new Widget()); std::shared_ptr《Widget》 q = p-》GetSharedObject(); std::cout 《《 p.use_count() 《《 std::endl; std::cout 《《 q.use_count() 《《 std::endl; return 0; }

這里為什么要?jiǎng)?chuàng)建智能指針p而不是直接創(chuàng)建裸指針p?根本原因在于std::enable_shared_from_this內(nèi)部的weak_ptr,若只是創(chuàng)建裸指針p,那么p被delete后仍然面對(duì)不安全使用內(nèi)部this指針問(wèn)題。

因此p只能被定義為智能指針。當(dāng)p被定義為shared_ptr智能指針后,p指針引用計(jì)數(shù)是1(weak_ptr不會(huì)增加引用計(jì)數(shù)),再通過(guò)shared_from_this獲取內(nèi)部this指針的智能指針,則p的引用計(jì)數(shù)變?yōu)?。

現(xiàn)編譯運(yùn)行輸出如下:

Widget constructor run 2 2 Widget destructor run

正確的返回了智能指針,p和q的引用計(jì)數(shù)都是2,且只調(diào)用了一次構(gòu)造函數(shù)和析構(gòu)函數(shù),不會(huì)錯(cuò)誤的析構(gòu)對(duì)象多次。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STD
    STD
    +關(guān)注

    關(guān)注

    0

    文章

    39

    瀏覽量

    14701

原文標(biāo)題:C++里std::enable_shared_from_this是干什么用的?

文章出處:【微信號(hào):harmonyos_developer,微信公眾號(hào):harmonyos_developer】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Neway電機(jī)方案在電機(jī)控制的應(yīng)用場(chǎng)景

    Neway電機(jī)方案在電機(jī)控制的應(yīng)用場(chǎng)景Neway電機(jī)方案在電機(jī)控制領(lǐng)域的應(yīng)用場(chǎng)景廣泛且效果顯著,其核心優(yōu)勢(shì)在步進(jìn)電機(jī)、伺服電機(jī)控制及CNC機(jī)床主軸驅(qū)動(dòng)等場(chǎng)景中得到了充分驗(yàn)證。一、步進(jìn)電機(jī)與伺服電機(jī)
    發(fā)表于 01-04 10:10

    請(qǐng)問(wèn)C語(yǔ)言中整形溢出對(duì)哪些應(yīng)用場(chǎng)景影響較大?

    C語(yǔ)言中整形溢出對(duì)哪些應(yīng)用場(chǎng)景影響較大
    發(fā)表于 12-24 08:24

    請(qǐng)問(wèn)MOSFET在電源管理中有哪些應(yīng)用場(chǎng)景?

    MOSFET在電源管理中有哪些應(yīng)用場(chǎng)景?
    發(fā)表于 12-23 07:07

    CW32L083系列微控制器有哪些應(yīng)用場(chǎng)景?

    CW32L083系列微控制器有哪些應(yīng)用場(chǎng)景
    發(fā)表于 12-16 07:52

    Switch的應(yīng)用場(chǎng)景

    Switch的應(yīng)用場(chǎng)景如下: 調(diào)用一到多個(gè)函數(shù) 設(shè)置變量值或者返回一個(gè)值 執(zhí)行一到多個(gè)代碼片段 如果case標(biāo)簽很多,在switch的前兩個(gè)使用場(chǎng)景中,使用查找表可以更高效的完成。例如下面的兩種
    發(fā)表于 12-12 07:28

    動(dòng)態(tài)調(diào)整策略的應(yīng)用場(chǎng)景有哪些?

    ? 動(dòng)態(tài)調(diào)整策略的核心價(jià)值是 “自適應(yīng)場(chǎng)景變化、平衡監(jiān)測(cè)精度與資源消耗” ,其應(yīng)用場(chǎng)景集中在 電網(wǎng)工況波動(dòng)大、設(shè)備資源受限、監(jiān)測(cè)需求多樣化 的場(chǎng)景,覆蓋電網(wǎng)側(cè)、用戶側(cè)、新能源側(cè)等全領(lǐng)域。以下是按
    的頭像 發(fā)表于 12-11 17:30 ?1371次閱讀

    藍(lán)牙網(wǎng)關(guān)是什么?都有哪些功能?應(yīng)用場(chǎng)景有哪些?

    點(diǎn),更構(gòu)建起“設(shè)備互聯(lián)-數(shù)據(jù)流轉(zhuǎn)-智能管控”的完整鏈路,成為物聯(lián)網(wǎng)生態(tài)中不可或缺的核心組件。本文將系統(tǒng)解析藍(lán)牙網(wǎng)關(guān)的核心價(jià)值、技術(shù)架構(gòu)、應(yīng)用場(chǎng)景、現(xiàn)存挑戰(zhàn)及未來(lái)趨勢(shì),為讀者呈現(xiàn)這一關(guān)鍵技術(shù)的全貌
    發(fā)表于 12-11 15:21

    智能指紋鎖CW32系列有哪些應(yīng)用場(chǎng)景?

    智能指紋鎖CW32系列有哪些應(yīng)用場(chǎng)景
    發(fā)表于 12-05 06:34

    CW32L083有哪些應(yīng)用場(chǎng)景

    CW32L083有哪些應(yīng)用場(chǎng)景
    發(fā)表于 11-24 07:37

    請(qǐng)問(wèn)CW32L011有哪些應(yīng)用場(chǎng)景?

    請(qǐng)問(wèn)CW32L011有哪些應(yīng)用場(chǎng)景
    發(fā)表于 11-17 06:25

    CW32L0系列都有哪些應(yīng)用場(chǎng)景?有哪些優(yōu)勢(shì)?

    目前芯源的低功耗MCU比較火爆,就是CW32L0系列都有哪些應(yīng)用場(chǎng)景?有哪些優(yōu)勢(shì)?
    發(fā)表于 11-14 06:03

    UWB應(yīng)用場(chǎng)景

    鴻合智遠(yuǎn)|捷揚(yáng)微-產(chǎn)品簡(jiǎn)介介紹:UWB應(yīng)用場(chǎng)景
    的頭像 發(fā)表于 05-12 10:05 ?1041次閱讀
    UWB應(yīng)<b class='flag-5'>用場(chǎng)景</b>

    圖形顯示控制芯片RA6809可適用于哪些應(yīng)用場(chǎng)景

    設(shè)備? ?應(yīng)用場(chǎng)景?:工業(yè)儀表、自動(dòng)化設(shè)備操作面板、生產(chǎn)線監(jiān)控終端等。 ?功能優(yōu)勢(shì)?:MCU端支持SPI串行接口,畫(huà)中畫(huà)(PIP)、透明度控制等特性,可實(shí)現(xiàn)復(fù)雜界面設(shè)計(jì)及快速內(nèi)容更新?1;低端普通單片機(jī)
    發(fā)表于 03-21 11:08

    取樣示波器的技術(shù)原理和應(yīng)用場(chǎng)景

    取樣示波器,也稱為采樣示波器,是一種重要的電子測(cè)量?jī)x器,其技術(shù)原理和應(yīng)用場(chǎng)景可以歸納如下:技術(shù)原理取樣示波器的根本原理是利用等效取樣技術(shù),將周期性高頻(或高速)信號(hào)變換為與原來(lái)信號(hào)波形相似的低頻(或
    發(fā)表于 03-12 14:34

    頻域示波器的技術(shù)原理和應(yīng)用場(chǎng)景

    頻域示波器,其主要技術(shù)原理基于信號(hào)的傅里葉變換理論,通過(guò)快速傅里葉變換(FFT)算法將時(shí)域信號(hào)轉(zhuǎn)換為頻域信號(hào),從而進(jìn)行頻譜分析。以下是對(duì)頻域示波器的技術(shù)原理和應(yīng)用場(chǎng)景的詳細(xì)分析:一、技術(shù)
    發(fā)表于 03-11 14:37