国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

std::enable_shared_from_this使用場景

5jek_harmonyos ? 來源:編程學習總站 ? 作者:寫代碼的牛頓 ? 2021-08-04 15:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

std::enable_shared_from_this使用場景

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

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

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

#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: 程序異常結束。

從輸出我們可以看到,調用了一次構造函數,卻調用了兩次析構函數,很明顯這是不正確的。而std::enable_shared_from_this正是為了解決這個問題而存在。

02

std::enable_shared_from_this原理和實戰

前面我們說使用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是模板類,內部有個_Tp類型weak_ptr指針,調用shared_from_this成員函數便可獲取到_Tp類型智能指針,從這里可以看出,_Tp類型就是我們的目標類型。

再來看看std::enable_shared_from_this的構造函數都是protected,因此不能直接創建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; }

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

因此p只能被定義為智能指針。當p被定義為shared_ptr智能指針后,p指針引用計數是1(weak_ptr不會增加引用計數),再通過shared_from_this獲取內部this指針的智能指針,則p的引用計數變為2。

現編譯運行輸出如下:

Widget constructor run 2 2 Widget destructor run

正確的返回了智能指針,p和q的引用計數都是2,且只調用了一次構造函數和析構函數,不會錯誤的析構對象多次。

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STD
    STD
    +關注

    關注

    0

    文章

    39

    瀏覽量

    14700

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

文章出處:【微信號:harmonyos_developer,微信公眾號:harmonyos_developer】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Neway電機方案在電機控制的應用場景

    Neway電機方案在電機控制的應用場景Neway電機方案在電機控制領域的應用場景廣泛且效果顯著,其核心優勢在步進電機、伺服電機控制及CNC機床主軸驅動等場景中得到了充分驗證。一、步進電機與伺服電機
    發表于 01-04 10:10

    請問C語言中整形溢出對哪些應用場景影響較大?

    C語言中整形溢出對哪些應用場景影響較大
    發表于 12-24 08:24

    請問MOSFET在電源管理中有哪些應用場景

    MOSFET在電源管理中有哪些應用場景
    發表于 12-23 07:07

    CW32L083系列微控制器有哪些應用場景

    CW32L083系列微控制器有哪些應用場景
    發表于 12-16 07:52

    Switch的應用場景

    Switch的應用場景如下: 調用一到多個函數 設置變量值或者返回一個值 執行一到多個代碼片段 如果case標簽很多,在switch的前兩個使用場景中,使用查找表可以更高效的完成。例如下面的兩種
    發表于 12-12 07:28

    動態調整策略的應用場景有哪些?

    ? 動態調整策略的核心價值是 “自適應場景變化、平衡監測精度與資源消耗” ,其應用場景集中在 電網工況波動大、設備資源受限、監測需求多樣化 的場景,覆蓋電網側、用戶側、新能源側等全領域。以下是按
    的頭像 發表于 12-11 17:30 ?1367次閱讀

    藍牙網關是什么?都有哪些功能?應用場景有哪些?

    點,更構建起“設備互聯-數據流轉-智能管控”的完整鏈路,成為物聯網生態中不可或缺的核心組件。本文將系統解析藍牙網關的核心價值、技術架構、應用場景、現存挑戰及未來趨勢,為讀者呈現這一關鍵技術的全貌
    發表于 12-11 15:21

    智能指紋鎖CW32系列有哪些應用場景

    智能指紋鎖CW32系列有哪些應用場景
    發表于 12-05 06:34

    CW32L083有哪些應用場景

    CW32L083有哪些應用場景
    發表于 11-24 07:37

    請問CW32L011有哪些應用場景

    請問CW32L011有哪些應用場景
    發表于 11-17 06:25

    CW32L0系列都有哪些應用場景?有哪些優勢?

    目前芯源的低功耗MCU比較火爆,就是CW32L0系列都有哪些應用場景?有哪些優勢?
    發表于 11-14 06:03

    UWB應用場景

    鴻合智遠|捷揚微-產品簡介介紹:UWB應用場景
    的頭像 發表于 05-12 10:05 ?1030次閱讀
    UWB應<b class='flag-5'>用場景</b>

    圖形顯示控制芯片RA6809可適用于哪些應用場景

    設備? ?應用場景?:工業儀表、自動化設備操作面板、生產線監控終端等。 ?功能優勢?:MCU端支持SPI串行接口,畫中畫(PIP)、透明度控制等特性,可實現復雜界面設計及快速內容更新?1;低端普通單片機
    發表于 03-21 11:08

    取樣示波器的技術原理和應用場景

    取樣示波器,也稱為采樣示波器,是一種重要的電子測量儀器,其技術原理和應用場景可以歸納如下:技術原理取樣示波器的根本原理是利用等效取樣技術,將周期性高頻(或高速)信號變換為與原來信號波形相似的低頻(或
    發表于 03-12 14:34

    頻域示波器的技術原理和應用場景

    頻域示波器,其主要技術原理基于信號的傅里葉變換理論,通過快速傅里葉變換(FFT)算法將時域信號轉換為頻域信號,從而進行頻譜分析。以下是對頻域示波器的技術原理和應用場景的詳細分析:一、技術
    發表于 03-11 14:37