国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

C++智能指針enable_shared_from_this

開發(fā) 前端
enable_shared_from_this其實是智能指針中的內(nèi)容,它的作用就是用于在類的內(nèi)部,返回一個this的智能指針。

enable_shared_from_this介紹

enable_shared_from_this其實是智能指針中的內(nèi)容,它的作用就是用于在類的內(nèi)部,返回一個this的智能指針。

對于enable_shared_from_this,初學者可能不明白它的使用場景和使用的必要性,可能有得童鞋們會問既然有了this這個指向自己的指針, 為什么還需要enable_shared_from_this這個東西呢,直接用this代替不就好了嗎?

我們來看看以下代碼例子,如果先不運行,你能看出什么問題嗎?

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

以上代碼運行崩潰報錯了,這是為什么呢?

崩潰信息

這是因為只有一個Person的指針,但是卻被兩個智能指針shared_ptr持有,而它們的引用計數(shù)都是1,因此當main函數(shù)運行完畢后兩個智能指針釋放時都對同一個Person指針進行釋放導致的崩潰。

如果我們能讓兩個智能指針shared_ptr共享同一個引用計數(shù),那么這個崩潰問題就迎刃而解了。而通過讓Person繼承基類enable_shared_from_this,然后在函數(shù)getPtr中 調(diào)用基類的shared_from_this就能返回一個this的智能指針,這樣即可實現(xiàn)讓多個智能指針共享同一個引用計數(shù),而達到銷毀時只釋放一次的目的。這就是enable_shared_from_this存在的必要性, 這也是this無法替代的功能點。

如下是實例代碼:

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

通過運行調(diào)試打印,我們可以看到這person和person1這兩個智能指針的引用計數(shù)都變?yōu)榱?,這是正確的。

通過兩個實例代碼的對比,我們可以發(fā)現(xiàn)問題的根源所在就是我們在返回this的智能指針時,直接調(diào)用std::shared_ptr構(gòu)造函數(shù)傳入裸指針的方式構(gòu)造一個智能指針, 而在之前的介紹中我們提到過使用智能指針shared_ptr時盡量使用std::make_shared進行智能指針的構(gòu)造,避免直接調(diào)用std::shared_ptr構(gòu)造函數(shù)傳入裸指針的方式進行構(gòu)造。

更多關(guān)于enable_shared_from_this的實踐對比可以參照官網(wǎng)學習:https://en.cppreference.com/w/cpp/memory/enable_shared_from_this

enable_shared_from_this的實現(xiàn)

我們通過源碼的方式來分析下enable_shared_from_this的實現(xiàn)原理,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;
};

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

C++之CRTP的使用

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

其實成員變量__weak_this_的初始化是在類的外部進行初始化的,它的奧秘就是源碼的倒數(shù)第二行template ();改為不使用智能指針, 而使用裸指針的方式,修改為 auto person = new Person;,同時注釋掉第16行再運行是會崩潰的,這就是因為__weak_this_沒有進行初始化的原因。

崩潰信息

責任編輯:趙寧寧 來源: 思想覺悟
相關(guān)推薦

2010-02-05 14:36:20

C++智能指針

2010-12-17 10:07:59

2025-08-01 01:55:00

2021-09-09 17:05:36

C++智能指針語言

2024-12-26 10:45:08

2023-12-20 12:40:51

C++RAII編程

2025-02-26 01:23:02

C++11Raw代碼

2024-01-24 11:44:44

C++智能指針開發(fā)

2015-07-27 11:34:03

Linux內(nèi)核指針

2024-03-01 16:43:48

C++11智能指針內(nèi)存

2021-08-11 09:01:48

智能指針Box

2010-01-27 14:18:41

Android智能指針

2021-07-29 06:09:05

萬能指針C語言void

2021-12-21 15:31:10

C++語言指針

2025-09-15 02:00:00

2011-07-01 14:28:47

Qt 指針

2010-01-26 13:42:28

C++指針

2011-04-11 11:09:50

this指針

2021-07-30 05:12:54

智能指針C++編程語言

2021-10-27 16:27:20

C++指針操控
點贊
收藏

51CTO技術(shù)棧公眾號

精品视频在线视频| 久久精品在线| 3d成人h动漫网站入口| 97久久综合精品久久久综合| 欧美一级一级性生活免费录像| 天天免费亚洲黑人免费| 日本欧美色综合网站免费| 快she精品国产999| 天堂av在线播放| 国产欧美一区二区白浆黑人| 高清电影一区| 春日野结衣av| 亚洲精品aⅴ| 国产精品色悠悠| 99天天综合性| 久久一本综合| 欧美日韩在线一| 亚洲视频你懂的| 国产片侵犯亲女视频播放| 99国产**精品****| 欧美精品福利在线| 视频一区视频二区中文字幕| 91麻豆福利| 亚洲黄色av女优在线观看| 青青草一区二区三区| 国产黄色在线| 日本一区二区三区在线视频| 午夜精品久久一牛影视| av最新在线| 欧美黑人xxx| 一区在线播放| 最近中文字幕mv第三季歌词| 91精品欧美综合在线观看最新| 在线黄色国产视频| 日韩av有码在线| 婷婷六月综合| 99热这里只有精品在线播放| 亚洲电影天堂av| 欧美激情成人在线| 日韩中文视频| 亚洲精品一区二| 亚洲欧洲精品成人久久奇米网| 99久久这里有精品| 亚洲爆乳无码精品aaa片蜜桃| 日日摸夜夜添一区| 中文字幕一区二区在线播放| 一区免费在线| 91精品国产综合久久久久久豆腐| 天天操天天综合网| 免费在线观看的电影网站| 国产一区二区不卡视频在线观看| 久久久精品免费观看| 精品孕妇一区二区三区| 视频一区视频二区视频| 国产精品自拍偷拍视频| 在线观看av不卡| 国内精品伊人久久久久av影院| 国产精品一站二站| 草久在线视频| 精品av久久707| 亚洲精品乱码久久久久| 亚洲成av人片乱码色午夜| 亚洲成a人v欧美综合天堂下载| 92久久精品| 91在线免费观看网站| 久久久久久久久一| 三妻四妾完整版在线观看电视剧| 国产精品三级网站| 久久免费视频色| 在线成人av观看| 日韩av一级大片| 91国偷自产一区二区三区成为亚洲经典| 精品久久久久久久久久岛国gif| 日韩精品资源| 欧美日韩久久久| 国产精品国产三级国产在线观看| 日本精品一区二区三区四区| 亚洲精品videossex少妇| 99xxxx成人网| 国产高清视频免费最新在线| 国产精品久久97| ...av二区三区久久精品| 亚洲码欧美码一区二区三区| 18禁网站免费无遮挡无码中文| 亚洲国产精品专区久久| 老司机一区二区三区| 国产福利在线观看| 亚洲va国产va天堂va久久| 亚洲成av人片在www色猫咪| 天堂成人娱乐在线视频免费播放网站 | 日韩av一区在线| 99热在线精品观看| 黄色片视频在线观看| 国产精品嫩草影院一区二区| 亚洲色图视频网站| 日韩精品导航| 99re在线视频播放| 国产+人+亚洲| 中文字幕一区二| 国产精品超碰| www.大网伊人| 在线免费不卡电影| 日韩精品视频网| 日韩成人伦理| 波多野结衣家庭教师视频| 九九九九精品| 欧美一级生活片| 国产欧美日韩一级| 亚洲男人资源| 日韩一级理论片| 国产精品国产三级国产专区53| 四虎国产成人永久精品免费| 精品无人区太爽高潮在线播放| 麻豆国产精品一区二区三区| 大菠萝精品导航| 日韩视频一二三| 久久久精品中文字幕| 国产欧美一区二区精品秋霞影院 | 1024精品合集| 蜜桃精品视频在线| 精品成人18| 交视频在线观看国产| 国产精品美女主播| 欧美日韩国产一区中文午夜| 欧美精品生活片| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 这里只有精品99re| 欧美激情性爽国产精品17p| 今天免费高清在线观看国语| 精品成人a区在线观看| www.色综合.com| 秋霞蜜臀av久久电影网免费| 日本五十路在线| 国产高清视频一区三区| 欧美群妇大交群的观看方式| 亚洲欧洲成视频免费观看| 这里精品视频免费| 999热视频在线观看| 一二三四社区在线视频6| 日韩脚交footjobhd| 亚洲国产精品日韩专区av有中文| 日韩视频一区二区三区在线播放免费观看| 亚洲精品偷拍| 久久激情五月激情| 亚洲美洲欧洲综合国产一区| 天堂成人国产精品一区| 亚洲无毛电影| 我不卡神马影院| 欧美爱爱网站| www久久久| 玖玖精品在线| 久久99精品久久久野外观看| 一本色道69色精品综合久久| 岛国在线视频免费看| 四虎精品成人影院观看地址| www.成人69.com| 狠狠干 狠狠操| 夜夜爽99久久国产综合精品女不卡 | 国产区一区二| 先锋影音国产一区| 黄色成人av网| 91精品在线国产| 欧美另类极限扩张| 成人羞羞在线观看网站| 伊人成人在线| 欧美成人一区二区三区片免费| 日韩av一区在线| 日本在线观看一区二区| 69成人在线| 新狼窝色av性久久久久久| 18欧美乱大交hd1984| 精品无人区太爽高潮在线播放| 国产精品视频入口| 成人看片毛片免费播放器| 欧美韩日一区二区三区| 91系列在线观看| 韩国成人漫画| 一区二区三区在线观看国产| 不卡视频一区| 免费成人直播| 国产精品免费看片| 91久久中文字幕| 欧美一级大黄| 久久国产精品一区二区| 久久国产精品久久久久久久久久| 欧美久久久久久久久久久久久久| 成人黄色免费短视频| 国产激情视频一区二区在线观看 | 亚洲经典在线看| 久久久久久91| 欧美xxxx黑人又粗又长| 日韩欧美第一页| h短视频大全在线观看| 精品一区二区日韩| 国产亚洲欧美一区二区| 久久精品女人天堂av免费观看 | 色综合久久久网| 免费在线精品视频| 日韩大片在线| 精品国产网站地址|