18video性欧美19sex,欧美高清videosddfsexhd,性少妇videosexfreexxx片中国,激情五月激情综合五月看花,亚洲人成网77777色在线播放

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

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

3天內不再提示

std::enable_shared_from_this使用場景

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

掃碼添加小助手

加入工程師交流群

std::enable_shared_from_this使用場景

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

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

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

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

再來看看std::enable_shared_from_this的構造函數都是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內部的weak_ptr,若只是創(chuàng)建裸指針p,那么p被delete后仍然面對不安全使用內部this指針問題。

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

現編譯運行輸出如下:

Widget constructor run 2 2 Widget destructor run

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

編輯:jq

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

    關注

    0

    文章

    36

    瀏覽量

    14634

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    UWB應用場景

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

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

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

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

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

    數據記錄儀的計數原理和應用場景

    數據記錄儀是一種用于測量、記錄和分析各種數據的設備,其計數原理和應用場景可以歸納如下: 一、計數原理數據記錄儀的計數原理主要基于傳感器技術、信號處理技術以及數據存儲技術。具體來說: 傳感器采集
    發(fā)表于 02-24 14:28

    meshtastic的應用場景介紹

    meshtastic的應用場景介紹
    的頭像 發(fā)表于 02-21 12:02 ?1181次閱讀
    meshtastic的應<b class='flag-5'>用場景</b>介紹

    敏捷合成器的技術原理和應用場景

    敏捷合成器,作為一種高性能的信號發(fā)生器,其技術原理和應用場景值得深入探討。技術原理敏捷合成器的技術原理主要基于先進的頻率合成技術和數字信號處理技術。它通常具有寬頻率范圍、快速建立和可編程的相位、頻率
    發(fā)表于 02-20 15:25

    脈沖信號分析儀?的原理和應用場景

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

    混合信號分析儀的原理和應用場景

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

    信號分析儀的原理和應用場景

    信號分析儀是一種用于分析電信號頻譜和特性的儀器,其原理和應用場景如下:一、信號分析儀的原理信號分析儀的工作原理基于頻譜分析技術。頻譜表示信號在各個頻率上的能量分布情況。具體過程如下: 信號采樣:信號
    發(fā)表于 01-17 14:37

    多用示波器的原理和應用場景

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

    倍頻器的技術原理和應用場景

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

    模塊化儀器的技術原理和應用場景

    模塊化儀器是插拔式的計算機板卡,功能類似于傳統(tǒng)的臺式儀器,其技術原理和應用場景可以歸納如下:一、技術原理 模塊化設計:模塊化儀器使用一個框架,可以將不同類型或不同數量的功能卡插入其中,從而適應一系列
    發(fā)表于 11-28 15:09

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

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

    OTA測試暗箱的技術原理和應用場景

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

    移動終端測試儀的技術原理和應用場景

    ,確保設備在導航服務中的準確性和可靠性。 應用場景移動終端測試儀的應用場景廣泛,涵蓋了從研發(fā)到生產、從維護到監(jiān)管的多個環(huán)節(jié): 移動維修服務:維修技術人員可以使用便攜的綜測儀快速對手機進行全面檢測
    發(fā)表于 11-04 16:01