色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

std::enable_shared_from_this使用場景

5jek_harmonyos ? 來源:編程學(xué)習(xí)總站 ? 作者:寫代碼的牛頓 ? 2021-08-04 15:35 ? 次閱讀

std::enable_shared_from_this使用場景

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

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

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

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

編譯運行后程序輸出如下:

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正是為了解決這個問題而存在。

02

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

前面我們說使用std::enable_shared_from_this能解決安全獲取this指針的問題。在使用之前,我們先來了解下std::enable_shared_from_this是什么?為什么能解決這個問題?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)部有個_Tp類型weak_ptr指針,調(diào)用shared_from_this成員函數(shù)便可獲取到_Tp類型智能指針,從這里可以看出,_Tp類型就是我們的目標類型。

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

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

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

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

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

Widget constructor run 2 2 Widget destructor run

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

編輯:jq

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

    關(guān)注

    0

    文章

    36

    瀏覽量

    14392

原文標題:C++里std::enable_shared_from_this是干什么用的?

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

收藏 人收藏

    評論

    相關(guān)推薦

    脈沖信號分析儀?的原理和應(yīng)用場景

    脈沖信號分析儀是一種用于測量和分析脈沖信號的精密儀器。以下是對其原理和應(yīng)用場景的詳細介紹:一、原理脈沖信號分析儀的工作原理主要基于電子測量技術(shù)和信號處理技術(shù)。當(dāng)脈沖信號被分析儀的接收器接收后,信號
    發(fā)表于 01-23 14:00

    混合信號分析儀的原理和應(yīng)用場景

    混合信號分析儀是一種集成度高、功能強大的電子測量設(shè)備,其原理和應(yīng)用場景如下:一、原理混合信號分析儀由模擬部分和數(shù)字部分組成,用于混合信號的分析。其工作原理主要包括以下幾個方面: 信號采樣:混合信號
    發(fā)表于 01-21 16:45

    多用示波器的原理和應(yīng)用場景

    多用示波器是一種功能強大的電子測量儀器,其原理和應(yīng)用場景如下:一、原理多用示波器主要是利用電子示波管的特性,將人眼無法直接觀測的交變電信號轉(zhuǎn)換成圖像,顯示在熒光屏上以便測量。具體來說,當(dāng)被測信號輸入
    發(fā)表于 01-09 15:42

    倍頻器的技術(shù)原理和應(yīng)用場景

    倍頻器是一種用于將輸入信號的頻率倍增的電子設(shè)備,以下是關(guān)于倍頻器的技術(shù)原理和應(yīng)用場景的詳細解釋:技術(shù)原理倍頻器的技術(shù)原理主要基于非線性元件(如二極管、晶體管等)的特性和頻率變換技術(shù)。 非線性元件
    發(fā)表于 11-29 14:49

    系統(tǒng)放大器的技術(shù)原理和應(yīng)用場景

    系統(tǒng)放大器是一種重要的電子設(shè)備,其技術(shù)原理和應(yīng)用場景都具有一定的專業(yè)性和廣泛性。以下是對系統(tǒng)放大器的技術(shù)原理和應(yīng)用場景的詳細介紹:一、技術(shù)原理系統(tǒng)放大器的工作原理基于電子器件的非線性特性,通過控制
    發(fā)表于 11-18 14:46

    OTA測試暗箱的技術(shù)原理和應(yīng)用場景

    OTA測試暗箱在無線通信設(shè)備的研發(fā)與測試中扮演著至關(guān)重要的角色。以下是對OTA測試暗箱技術(shù)原理和應(yīng)用場景的詳細闡述:一、OTA測試暗箱的技術(shù)原理OTA測試暗箱的技術(shù)原理主要基于電磁波在封閉空間
    發(fā)表于 11-14 14:36

    實時示波器的技術(shù)原理和應(yīng)用場景

    實時示波器是一種高性能的電子測量儀器,其技術(shù)原理和應(yīng)用場景對于電子工程和通信技術(shù)領(lǐng)域具有重要意義。以下是對實時示波器的技術(shù)原理和應(yīng)用場景的詳細解釋:一、技術(shù)原理實時示波器的工作原理基于電子束在熒光屏
    發(fā)表于 10-23 14:22

    源測量單元設(shè)備的技術(shù)原理和應(yīng)用場景

    源測量單元(SMU)設(shè)備是一種集成了精密電源(PPS)和高性能數(shù)字萬用表(DMM)功能的測試設(shè)備。以下是對其技術(shù)原理和應(yīng)用場景的詳細解析:一、技術(shù)原理 集成功能: SMU在單個儀器中集成了電源
    發(fā)表于 10-22 11:10

    太陽膜測試儀的技術(shù)原理和應(yīng)用場景

    太陽膜測試儀的技術(shù)原理和應(yīng)用場景可以詳細闡述如下:技術(shù)原理太陽膜測試儀的技術(shù)原理主要基于光學(xué)測量和物理定律。具體來說,它通過模擬太陽光中的各種波長(主要是紫外線、可見光和紅外線)的輻射,來檢測太陽膜
    發(fā)表于 09-29 14:18

    超聲波測厚儀的技術(shù)原理和應(yīng)用場景

    超聲波測厚儀的技術(shù)原理和應(yīng)用場景詳細如下:技術(shù)原理超聲波測厚儀利用超聲波脈沖反射原理來測量材料的厚度。具體工作原理如下: 發(fā)射超聲波脈沖:測厚儀的探頭(也稱為換能器)向被測物體發(fā)射一束高頻超聲波脈沖
    發(fā)表于 09-27 15:06

    如何對MIL-STD-1553B進行選型

    MIL-STD-1553B產(chǎn)品選型是一個復(fù)雜而細致的過程,?需要綜合考慮多個因素以確保所選產(chǎn)品能夠滿足特定應(yīng)用場景的需求。一、?引言MIL-STD-1553B作為一種廣泛應(yīng)用于航空航天領(lǐng)域的數(shù)據(jù)總線
    的頭像 發(fā)表于 09-05 17:37 ?445次閱讀
    如何對MIL-<b class='flag-5'>STD</b>-1553B進行選型

    請問risc-v芯片的主要應(yīng)用場景是哪里?

    如題,我想請教一下risc-v芯片與其他的芯片在應(yīng)用場景上有哪些不一樣?
    發(fā)表于 07-30 21:23

    FPGA與MCU的應(yīng)用場景

    FPGA的應(yīng)用場景有這些: 快速原型設(shè)計 FPGA可以快速配置成多種定制數(shù)字電路,允許在不需要昂貴且耗時的制造過程的情況下進行快速部署和修改。 硬件加速 在需要高性能和低延遲的應(yīng)用中,F(xiàn)PGA的并行
    發(fā)表于 07-29 15:45

    STM32待機模式適合用于那些應(yīng)用場景

    對于查看STM32低功耗模式,共有三種,其中最省電的為待機模式,但是待機模式喚醒后相當(dāng)于軟件復(fù)位了,ram及寄存器中的值都復(fù)位了,僅僅是備份域的寄存器除外,因此有個疑問,待機模式適合用于那些應(yīng)用場景
    發(fā)表于 05-07 07:46

    NanoEdge AI的技術(shù)原理、應(yīng)用場景及優(yōu)勢

    能耗并提高數(shù)據(jù)安全性。本文將對 NanoEdge AI 的技術(shù)原理、應(yīng)用場景以及優(yōu)勢進行綜述。 1、技術(shù)原理 NanoEdge AI 的核心技術(shù)包括邊緣計算、神經(jīng)網(wǎng)絡(luò)壓縮和低功耗硬件設(shè)計。邊緣計算
    發(fā)表于 03-12 08:09
    主站蜘蛛池模板: 国产成人精品视频频 | 天天操人人射 | 亚洲精品久久午夜麻豆 | 99精品久久久久久久 | 美女张开腿让男人桶爽无弹窗 | 亚洲人视频在线观看 | 97 sese| 久久99国产精品蜜臀AV | 国产成人v视频在线观看 | 国产Av男人的天堂精品良久 | 99久久99久久免费精品蜜桃 | 动漫女主被扒开双腿羞辱 | 麻花豆传媒剧国产免费mv观看 | 国产精品免费一区二区三区四区 | 国产免费人成在线视频视频 | 一个人免费视频在线观看高清频道 | 芭乐草莓樱桃丝瓜18岁大全 | 亚洲精品久久久WWW游戏好玩 | 国产欧美精品一区二区三区-老狼 | 久久99热狠狠色一区二区 | 迅雷成人论坛 | 岛国在线永久免费视频 | 免费人成网站在线观看10分钟 | 欧美乱妇日本无乱码特黄大片 | 国精产品一区一区三区有限在线 | 亚洲视频一区 | 人人爽久久久噜噜噜丁香AV | 少男同志freedeos | 91区国产福利在线观看午夜 | 亚洲精品久久区二区三区蜜桃臀 | 99在线这精品视频 | 国产精品野外AV久久久 | 欧美精品九九99久久在观看 | 久青草国产在线视频 | 新妺妺窝人体色WWW 新金梅瓶玉蒲团性奴3 | 亚洲精品一区二区在线看片 | 野花韩国高清完整版在线 | 2019午夜福合集不打码 | 2020年国产精品午夜福利在线观看 | 日本熟妇乱妇熟色A片蜜桃亚洲 | 国产Av男人的天堂精品良久 |