日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

在很多場(chǎng)合,經(jīng)常會(huì)遇到一種情況,如何安全的獲取對(duì)象的this指針,一般來說我們不建議直接返回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)在我們來看一段代碼。

#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è)問題而存在。

02

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

前面我們說使用std::enable_shared_from_this能解決安全獲取this指針的問題。在使用之前,我們先來了解下std::enable_shared_from_this是什么?為什么能解決這個(gè)問題?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)類型。

再來看看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指針問題。

因此p只能被定義為智能指針。當(dāng)p被定義為shared_ptr智能指針后,p指針引用計(jì)數(shù)是1(weak_ptr不會(huì)增加引用計(jì)數(shù)),再通過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)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STD
    STD
    +關(guān)注

    關(guān)注

    0

    文章

    39

    瀏覽量

    14717

原文標(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)問C語言中整形溢出對(duì)哪些應(yīng)用場(chǎng)景影響較大?

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

    請(qǐng)問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 ?1542次閱讀

    藍(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)及未來趨勢(shì),為讀者呈現(xiàn)這一關(guān)鍵技術(shù)的全貌
    發(fā)表于 12-11 15:21

    CW32 SysClk系統(tǒng)時(shí)鐘的應(yīng)用場(chǎng)景與切換規(guī)則

    。 主要應(yīng)用場(chǎng)景包括: 1、時(shí)鐘故障自動(dòng)切換當(dāng)檢測(cè)到當(dāng)前系統(tǒng)時(shí)鐘源失效時(shí),可快速安全切換到其它可用時(shí)鐘源上,提高產(chǎn)品可靠性。 2、功耗管理在待機(jī)狀態(tài)切換 SysClk 的時(shí)鐘源為低速時(shí)鐘降低系統(tǒng)功耗,在
    發(fā)表于 12-11 07:51

    智能指紋鎖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)問CW32L011有哪些應(yīng)用場(chǎng)景?

    請(qǐng)問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

    Leadway微波產(chǎn)品有哪些應(yīng)用場(chǎng)景?

    。Leadway微波產(chǎn)品的應(yīng)用場(chǎng)景如下:5G/6G通信測(cè)試毫米波基站與終端設(shè)備測(cè)試:Leadway的測(cè)試級(jí)柔性/鎧裝毫米波線纜(DC-110GHz)支持高頻段信號(hào)傳輸與校準(zhǔn),確保通信質(zhì)量。其低插損特性
    發(fā)表于 09-26 09:14

    多端協(xié)同主要應(yīng)用場(chǎng)景介紹

    多端協(xié)同 功能描述 多端協(xié)同主要包括如下場(chǎng)景: 通過跨設(shè)備啟動(dòng)UIAbility和ServiceExtensionAbility組件實(shí)現(xiàn)多端協(xié)同(無返回?cái)?shù)據(jù)) 通過跨設(shè)備啟動(dòng)UIAbility
    發(fā)表于 05-21 07:37

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

    鴻合智遠(yuǎn)|捷揚(yáng)微-產(chǎn)品簡(jiǎn)介介紹:UWB應(yīng)用場(chǎng)景
    的頭像 發(fā)表于 05-12 10:05 ?1254次閱讀
    UWB應(yīng)<b class='flag-5'>用場(chǎng)景</b>
    壶关县| 贡嘎县| 宣城市| 光泽县| 巴中市| 邹平县| 班戈县| 永丰县| 双鸭山市| 中阳县| 简阳市| 阿拉善左旗| 类乌齐县| 郯城县| 东方市| 施甸县| 淅川县| 巴东县| 芷江| 宜城市| 寿阳县| 沾益县| 封丘县| 万源市| 宁化县| 舟山市| 城步| 景德镇市| 达拉特旗| 新源县| 池州市| 万源市| 张北县| 泰和县| 宁德市| 邵武市| 井陉县| 班戈县| 祁东县| 裕民县| 武清区|