精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++智能指針enable_shared_from_this

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

enable_shared_from_this介紹

enable_shared_from_this其實是智能指針中的內容,它的作用就是用于在類的內部,返回一個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持有,而它們的引用計數都是1,因此當main函數運行完畢后兩個智能指針釋放時都對同一個Person指針進行釋放導致的崩潰。

如果我們能讓兩個智能指針shared_ptr共享同一個引用計數,那么這個崩潰問題就迎刃而解了。而通過讓Person繼承基類enable_shared_from_this,然后在函數getPtr中 調用基類的shared_from_this就能返回一個this的智能指針,這樣即可實現讓多個智能指針共享同一個引用計數,而達到銷毀時只釋放一次的目的。這就是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;
}

通過運行調試打印,我們可以看到這person和person1這兩個智能指針的引用計數都變為了2,這是正確的。

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

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

enable_shared_from_this的實現

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

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

C++之CRTP的使用

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

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

崩潰信息

責任編輯:趙寧寧 來源: 思想覺悟
相關推薦

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++智能指針開發

2015-07-27 11:34:03

Linux內核指針

2024-03-01 16:43:48

C++11智能指針內存

2010-01-27 14:18:41

Android智能指針

2021-08-11 09:01:48

智能指針Box

2025-09-15 02:00:00

2021-12-21 15:31:10

C++語言指針

2021-07-29 06:09:05

萬能指針C語言void

2011-07-01 14:28:47

Qt 指針

2011-04-11 11:09:50

this指針

2010-01-26 13:42:28

C++指針

2021-07-30 05:12:54

智能指針C++編程語言

2010-01-28 13:57:19

C++指針基礎
點贊
收藏

51CTO技術棧公眾號

久久久亚洲午夜电影| 不卡在线一区二区| 午夜在线成人av| 欧美裸体网站| 国产视频手机在线观看| 日韩午夜电影| 日韩在线观看网站| 青青草视频网站| 国产69精品久久| 香蕉成人伊视频在线观看| 亚洲国产激情一区二区三区| 性生活视频软件| 日本中文一区二区三区| 久久久久久久爱| 久久视频一区二区三区| 久久a爱视频| 91精品欧美一区二区三区综合在| 日本www在线视频| 成人黄视频在线观看| 91蜜桃婷婷狠狠久久综合9色| 成人网在线观看| 青青青国产在线| 欧美视频日韩| 久久精品国产电影| 少妇精品无码一区二区免费视频| 亚洲综合影院| 欧美一二三四在线| xxww在线观看| 99只有精品| 日韩欧美国产成人| 青青草精品视频在线| 超碰在线观看免费版| 中文字幕中文字幕在线一区| 免费一区二区三区| 国产91免费在线观看| 激情综合一区二区三区| 国产成人综合av| 在线观看免费av片| 国产精品社区| 91超碰中文字幕久久精品| 黄色在线观看免费| 欧美高清日韩| 欧美成人手机在线| 91麻豆免费视频网站| 97视频热人人精品免费| 在线看国产精品| 久久久久亚洲av无码a片| 国产成人3p视频免费观看| 日韩电视剧免费观看网站| 国产xxxx视频| 欧美绝顶高潮抽搐喷水合集| 欧美mv日韩mv国产网站app| 中文字幕线观看| 国产精久久久| 日韩欧美亚洲国产精品字幕久久久| 一起操在线视频| 一区二区三区无毛| 日韩一区二区精品葵司在线 | 国精产品视频一二二区| 精品久久不卡| 三级精品视频久久久久| 你懂得在线观看| 亚洲美女视频| 久久久人成影片一区二区三区观看| 久草视频免费在线播放| 精品动漫3d一区二区三区免费| 久久久久久久久久久人体| 日韩精品久久久久久久| 免费亚洲婷婷| 国产精品日韩在线一区| 91资源在线视频| 国产在线国偷精品产拍免费yy| 亚洲自拍av在线| 欧美熟女一区二区| 欧美激情一区二区三区全黄| 亚洲一区不卡在线| 先锋成人av| 欧美性jizz18性欧美| 激情综合网俺也去| 亚洲欧美专区| 精品99一区二区| 欧洲女同同性吃奶| 91av精品| 欧洲精品在线视频| 91久久精品国产91性色69| 国产电影精品久久禁18| 免费影院在线观看一区 | 欧美激情啊啊啊| 亚洲成熟少妇视频在线观看| 激情欧美日韩一区二区| 国产伦精品一区二区三区照片91| 你懂的视频在线播放| 国产精品的网站| 久久久久久久久久久视频| 福利一区二区| 精品伊人久久97| 天天操天天操天天操天天操天天操| 国产综合自拍| 91精品久久久久久久| 日韩一卡二卡在线| 国产精品超碰97尤物18| 欧美三级一级片| 不卡精品视频| 亚洲天堂影视av| 久久精品人妻一区二区三区| 日本在线不卡视频| 国产美女精品在线观看| 色多多视频在线观看| 午夜视频一区二区三区| 做a视频在线观看| 亚洲另类春色校园小说| 欧美黑人国产人伦爽爽爽| 亚洲精品无码久久久久| 99久久精品国产导航| 浴室偷拍美女洗澡456在线| 在线天堂新版最新版在线8| 日韩欧美在线综合网| 日本高清黄色片| 老鸭窝91久久精品色噜噜导演| 亚洲一区二区三区视频| 95在线视频| 欧美专区亚洲专区| 亚洲黄色免费在线观看| 欧美成人一品| 成人免费自拍视频| 92国产在线视频| av亚洲在线观看| 亚洲永久精品大片| 亚洲自拍第三页| 99久久亚洲精品蜜臀| 国产999在线观看| 日韩精品一二| 岛国av一区二区三区| 亚洲成年人在线观看| 欧美激情第二页| 91精品国产一区二区三区动漫| 黄网站视频在线观看| 欧美日韩在线播放三区| 亚洲最大成人综合网| 久久久精品性| 日韩久久久久久久| 成人网ww555视频免费看| 精品网站999www| 久久亚洲精品国产| 91在线视频官网| 成年人免费在线播放| 竹菊久久久久久久| 日韩av快播网址| 岛国视频免费在线观看| 欧洲国内综合视频| 国产日韩精品中文字无码| 蜜桃久久久久久| 在线观看一区欧美| 久久久91麻豆精品国产一区| 欧美另类极品videosbestfree| 国产伦精品一区二区三区免.费| 亚洲啪啪综合av一区二区三区| 激情久久综合网| 伊人久久成人| 欧美国产一区二区在线| 免费欧美电影| 久久精品99久久久久久久久 | 中文字幕一区久| 亚洲欧洲自拍偷拍| 中文字幕在线观看第二页| 国产精品电影院| 91人妻一区二区| 国产深夜精品| 中文字幕一区二区三区四区五区 | 国产欧美日韩亚洲| 三级在线看中文字幕完整版| 亚洲性生活视频在线观看| 在线观看色网站| 亚洲一区二区三区中文字幕在线| 水蜜桃av无码| 蜜桃视频在线观看一区| 日本大片免费看| 亚洲综合图色| 91在线观看免费观看| 都市激情久久综合| 国产一区二区久久精品| 国产喷水吹潮视频www| 亚洲电影中文字幕在线观看| 黑人巨大精品欧美| 精品亚洲欧美一区| www.浪潮av.com| 亚洲啊v在线观看| 久久伊人一区| 高清久久一区| 国产999在线观看| 欧洲性视频在线播放| 亚洲欧美中文日韩在线| 国产精品污视频| 日韩欧美在线视频观看| 欧洲第一无人区观看| 久久这里都是精品| 日本中文字幕在线不卡| 玖玖国产精品视频| 波多野结衣av一区二区全免费观看| 中文在线永久免费观看| 亚洲乱妇老熟女爽到高潮的片| 无码 人妻 在线 视频| 国产一级视频在线观看| 国产又粗又猛又黄| 香蕉视频国产在线观看| 日韩成人在线电影| 欧美高清在线| 国产·精品毛片| 日本一区二区免费在线观看视频| 91精品国产综合久久久久久久久久 | 清纯唯美亚洲色图| 3d成人动漫网站| 中文字幕av影院| 亚洲成av人片在线观看无码| 老司机深夜福利网站| 久久一夜天堂av一区二区三区| 樱花草www在线| 蜜桃视频在线观看一区| 中文字幕日本最新乱码视频| 欧美全黄视频| 热这里只有精品| 三区四区不卡| 日韩欧美精品一区二区| 亚洲盗摄视频| 国产精品av一区| 视频在线观看免费影院欧美meiju| 国产精品老牛影院在线观看| 一级毛片久久久| 7777精品视频| av丝袜在线| 欧美精品福利在线| 韩国日本一区| 欧美国产乱视频| 中日韩高清电影网| 美日韩精品视频免费看| 快射av在线播放一区| 色偷偷av一区二区三区| 岛国在线视频免费看| 国产午夜一区二区| 黄色片在线看| 亚洲欧洲一区二区三区在线观看| 日本成人一区| 亚洲精品视频二区| 二区在线视频| 色琪琪综合男人的天堂aⅴ视频| 大片免费播放在线视频| 中文字幕日韩综合av| 1024免费在线视频| www.国产一区| 亚洲性图自拍| 欧美华人在线视频| 国产乱码午夜在线视频| 2019精品视频| 天堂久久午夜av| 国产免费久久av| 精品国产亚洲一区二区在线观看| 99re视频在线播放| 国产精品传媒| 欧洲成人一区二区| 色喇叭免费久久综合| 只有这里有精品| 亚洲视频免费| 免费无码国产v片在线观看| 性欧美长视频| 午夜免费看毛片| 国产精品一区免费视频| yjizz视频| 久久日一线二线三线suv| 美国黄色特级片| 亚洲欧美日韩国产一区二区三区 | 欧美无人区码suv| 久久午夜羞羞影院免费观看| 四季av中文字幕| 一区二区三区在线免费视频| 日本特黄一级片| 欧美色图在线视频| 91久久久久国产一区二区| 精品999在线播放| 成人在线高清视频| 久久久之久亚州精品露出| 国产精品av一区二区三区| 国产欧美精品一区二区三区-老狼| 九九九九九九精品任你躁| 精品一区二区视频| 久久网站免费观看| 国产v片免费观看| 美女脱光内衣内裤视频久久网站| 波多野结衣三级视频| 久久网站最新地址| 2021亚洲天堂| 欧美亚洲国产一区二区三区| www.久久久久久久久久| 亚洲男人天堂视频| 日韩伦理av| 国产精品国产三级国产aⅴ9色| 亚洲精品一区二区三区在线| 欧洲精品久久| 韩国亚洲精品| 日本免费色视频| 99久久精品99国产精品| 亚洲国产精品免费在线观看| 日本国产一区二区| 国产91绿帽单男绿奴| 久久久国产精品亚洲一区| 不卡av播放| 国产98在线|日韩| 婷婷精品进入| 手机在线免费观看毛片| av亚洲产国偷v产偷v自拍| 成人涩涩小片视频日本| 91久久国产综合久久| 成人免费公开视频| 久久九九亚洲综合| 先锋欧美三级| 欧美国产二区| 国产精品视频| 精品国产一区在线| 亚洲精品高清在线观看| 在线观看中文字幕码| 亚洲欧美变态国产另类| 国产理论在线| 好看的日韩精品视频在线| 欧美区国产区| 能看毛片的网站| 日韩久久一区二区| 97人妻精品一区二区三区视频| 亚洲最新av网址| 午夜精品成人av| 免费久久久一本精品久久区| 国产欧美日韩亚洲一区二区三区| 中文字幕在线播放一区二区| 亚洲欧美另类在线| 国产免费一区二区三区最新不卡 | 台湾天天综合人成在线| 视频在线99| 日韩精品午夜视频| 成人黄色a级片| 欧美色中文字幕| www 日韩| 国产日本欧美一区| 99精品美女| 中文字幕久久av| 亚洲人吸女人奶水| av免费观看网址| 欧美大片网站在线观看| 欧美久久亚洲| 成人在线国产视频| 99久久精品国产精品久久| 免费日韩一级片| 亚洲美女中文字幕| 国产一区二区三区影视| 亚洲女人毛片| 国产专区欧美精品| 久久午夜无码鲁丝片| 精品国产乱码久久久久久久久| 92久久精品| 欧美久久久久久一卡四| 日本中文在线一区| 国产精品国产精品88| 欧美不卡视频一区| a国产在线视频| 欧美亚洲免费高清在线观看| 奇米色一区二区| 午夜爽爽爽男女免费观看| 精品美女一区二区| 一区二区乱码| 亚洲区一区二区三区| 国产在线一区二区| 日本一区二区不卡在线| 亚洲欧美中文在线视频| 开心久久婷婷综合中文字幕| 热久久最新地址| 99国产精品99久久久久久| 无码人妻精品一区二区50| 日韩视频欧美视频| 东京久久高清| 国产一区二区在线免费播放| 亚洲视频在线一区| 天天综合网在线| 国产综合香蕉五月婷在线| 影音先锋亚洲精品| 欧美亚洲色综久久精品国产| 精品国产一区二区三区av性色 | 二区在线播放| 精品高清视频| 精品综合久久久久久8888| 久久高清免费视频| 中文字幕精品久久久久| 成人在线视频中文字幕| www.com黄色片| 亚洲高清免费在线| 欧美成人xxx| 久久久久久久久久久一区| 激情综合色播五月| 国产精品一区二区三区四| 久久亚洲国产成人| 神马电影久久| 9.1在线观看免费| 欧美日韩中文一区| 免费看男女www网站入口在线 |