亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++?Boost?weak_ptr智能指針超詳細(xì)講解

 更新時(shí)間:2022年11月17日 11:03:38   作者:無水先生  
智能指針是一種像指針的C++對(duì)象,但它能夠在對(duì)象不使用的時(shí)候自己銷毀掉。雖然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷貝和賦值操作),因此很少有人使用。它是Boost各組件中,應(yīng)用最為廣泛的一個(gè)

一、提要

在 C++11 中,boost::weak_ptr是另一類智能指針,一般是用COM組件生成、調(diào)用,本文闡述這種指針的特點(diǎn)和用法。

二、特別智能指針(Special Smart Pointers)

到目前為止介紹的每個(gè)智能指針都可以在不同的場景中單獨(dú)使用。但是,boost::weak_ptr 僅在與 boost::shared_ptr 結(jié)合使用時(shí)才有意義。 boost::weak_ptr 在 boost/weak_ptr.hpp 中定義。

示例1.Usingboost::weak_ptr

#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <thread>
#include <functional>
#include <iostream>
void reset(boost::shared_ptr<int> &sh)
{
  sh.reset();
}
void print(boost::weak_ptr<int> &w)
{
  boost::shared_ptr<int> sh = w.lock();
  if (sh)
    std::cout << *sh << '\n';
}
int main()
{
  boost::shared_ptr<int> sh{new int{99}};
  boost::weak_ptr<int> w{sh};
  std::thread t1{reset, std::ref(sh)};
  std::thread t2{print, std::ref(w)};
  t1.join();
  t2.join();
}

boost::weak_ptr 必須使用 boost::shared_ptr 進(jìn)行初始化。它最重要的成員函數(shù)是 lock()。 lock() 返回一個(gè) boost::shared_ptr ,它與用于初始化弱指針的共享指針共享所有權(quán)。如果共享指針為空,則返回的指針也將為空。

boost::weak_ptr 是有意義的,只要一個(gè)函數(shù)需要與一個(gè)由共享指針管理的對(duì)象一起工作,但對(duì)象的生命周期不依賴于函數(shù)本身。該函數(shù)只能使用該對(duì)象,只要它由程序中其他位置的至少一個(gè)共享指針擁有。如果共享指針被重置,則對(duì)象無法保持活動(dòng)狀態(tài),因?yàn)橄鄳?yīng)函數(shù)內(nèi)有一個(gè)額外的共享指針。

示例 1 在 main() 中創(chuàng)建了兩個(gè)線程。第一個(gè)線程執(zhí)行函數(shù) reset(),該函數(shù)接收對(duì)共享指針的引用。第二個(gè)線程執(zhí)行函數(shù) print(),該函數(shù)接收對(duì)弱指針的引用。這個(gè)弱指針之前已經(jīng)用共享指針初始化了。

程序啟動(dòng)后,reset() 和 print() 會(huì)同時(shí)執(zhí)行。但是,無法預(yù)測執(zhí)行順序。這會(huì)導(dǎo)致當(dāng)對(duì)象被 print() 訪問時(shí),reset() 會(huì)破壞該對(duì)象的潛在問題。

弱指針通過以下方式解決了這個(gè)問題:調(diào)用 lock() 返回一個(gè)共享指針,該指針指向一個(gè)有效對(duì)象(如果在調(diào)用時(shí)存在一個(gè)有效對(duì)象)。如果不是,則共享指針設(shè)置為 0,相當(dāng)于一個(gè)空指針。

boost::weak_ptr 本身對(duì)對(duì)象的生命周期沒有任何影響。為了安全地訪問 print() 函數(shù)中的對(duì)象,lock() 返回一個(gè) boost::shared_ptr。這保證了即使不同的線程嘗試釋放對(duì)象,由于返回的共享指針,它仍將繼續(xù)存在。

示例2 .使用boost::intrusive_ptr

#include <boost/intrusive_ptr.hpp>
#include <atlbase.h>
#include <iostream>
void intrusive_ptr_add_ref(IDispatch *p) { p->AddRef(); }
void intrusive_ptr_release(IDispatch *p) { p->Release(); }
void check_windows_folder()
{
  CLSID clsid;
  CLSIDFromProgID(CComBSTR{"Scripting.FileSystemObject"}, &clsid);
  void *p;
  CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER, __uuidof(IDispatch), &p);
  boost::intrusive_ptr<IDispatch> disp{static_cast<IDispatch*>(p), false};
  CComDispatchDriver dd{disp.get()};
  CComVariant arg{"C:\\Windows"};
  CComVariant ret{false};
  dd.Invoke1(CComBSTR{"FolderExists"}, &arg, &ret);
  std::cout << std::boolalpha << (ret.boolVal != 0) << '\n';
}
int main()
{
  CoInitialize(0);
  check_windows_folder();
  CoUninitialize();
}

通常,boost::intrusive_ptr 的工作方式與 boost::shared_ptr 相同。但是,雖然 boost::shared_ptr 會(huì)跟蹤引用特定對(duì)象的共享指針的數(shù)量,但開發(fā)人員在使用 boost::intrusive_ptr 時(shí)必須這樣做。如果其他類已經(jīng)跟蹤引用,這可能是有意義的。

boost::intrusive_ptr 在 boost/intrusive_ptr.hpp 中定義。

示例 2 使用 COM 提供的功能,因此只能在 Windows 上構(gòu)建和運(yùn)行。 COM 對(duì)象是 boost::intrusive_ptr 的一個(gè)很好的例子,因?yàn)樗鼈兏櫼盟鼈兊闹羔樀臄?shù)量。內(nèi)部引用計(jì)數(shù)器可以通過成員函數(shù) AddRef() 和 Release() 遞增或遞減 1。一旦計(jì)數(shù)器達(dá)到 0,COM 對(duì)象就會(huì)自動(dòng)銷毀。

??? 從 intrusive_ptr_add_ref() 和 intrusive_ptr_release() 調(diào)用兩個(gè)成員函數(shù) AddRef() 和 Release()。 Boost.Intrusive 希望開發(fā)人員定義這兩個(gè)函數(shù),當(dāng)引用計(jì)數(shù)器必須遞增或遞減時(shí),它們會(huì)自動(dòng)調(diào)用。傳遞給這些函數(shù)的參數(shù)是指向用于實(shí)例化類模板 boost::intrusive_ptr 的類型的指針。

此示例中使用的 COM 對(duì)象稱為 FileSystemObject,默認(rèn)情況下可在 Windows 上使用。它提供對(duì)底層文件系統(tǒng)的訪問,例如,檢查給定目錄是否存在。在示例 1.9 中,檢查了名為 C:\Windows 的目錄是否存在。其內(nèi)部工作方式僅取決于 COM,與 boost::intrusive_ptr 的功能無關(guān)。關(guān)鍵是一旦侵入指針 disp 在 check_windows_folder() 結(jié)束時(shí)超出范圍,函數(shù) intrusive_ptr_release() 就會(huì)被自動(dòng)調(diào)用。這反過來會(huì)將 FileSystemObject 的內(nèi)部引用計(jì)數(shù)器減為 0 并銷毀該對(duì)象。

傳遞給 boost::intrusive_ptr 的構(gòu)造函數(shù)的參數(shù) false 會(huì)阻止 intrusive_ptr_add_ref() 被調(diào)用。當(dāng)使用 CoCreateInstance() 創(chuàng)建 COM 對(duì)象時(shí),計(jì)數(shù)器已設(shè)置為 1。因此,不得使用 intrusive_ptr_add_ref() 遞增。

到此這篇關(guān)于C++ Boost weak_ptr智能指針超詳細(xì)講解的文章就介紹到這了,更多相關(guān)C++ Boost weak_ptr內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode165.版本比較)

    C++實(shí)現(xiàn)LeetCode165.版本比較)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode165.版本比較),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • c語言實(shí)現(xiàn)兩個(gè)值互相交換的函數(shù)

    c語言實(shí)現(xiàn)兩個(gè)值互相交換的函數(shù)

    本文通過代碼給大家介紹c語言實(shí)現(xiàn)兩個(gè)值互相交換的函數(shù),通過實(shí)例代碼給大家講解的很詳細(xì),具有一定的參考借鑒價(jià)值,對(duì)c語言兩個(gè)值互換函數(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-05-05
  • Qt讀寫XML文件的方法詳解(含源碼+注釋)

    Qt讀寫XML文件的方法詳解(含源碼+注釋)

    XML文件可以用來存儲(chǔ)項(xiàng)目中的數(shù)據(jù),它相當(dāng)于一個(gè)簡單的數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于Qt讀寫XML文件(含源碼+注釋)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • 一篇文章徹底搞懂C++常見容器

    一篇文章徹底搞懂C++常見容器

    容器就是一些特定類型對(duì)象的集合,容器可以分為順序容器和關(guān)聯(lián)容器,下面這篇文章主要給大家介紹了關(guān)于C++常見容器的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • C語言中條件判斷的正確使用姿勢

    C語言中條件判斷的正確使用姿勢

    在C語言中,有三種條件判斷結(jié)構(gòu):if語句、if-else語句和switch語句,這篇文章主要來和大家講解一下它們的正確使用姿勢,需要的可以參考一下
    2023-05-05
  • C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(Map實(shí)現(xiàn))

    C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(Map實(shí)現(xiàn))

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言中如何實(shí)現(xiàn)桶排序

    C語言中如何實(shí)現(xiàn)桶排序

    這篇文章主要介紹了C語言中如何實(shí)現(xiàn)桶排序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 一文學(xué)會(huì)數(shù)據(jù)結(jié)構(gòu)-堆

    一文學(xué)會(huì)數(shù)據(jù)結(jié)構(gòu)-堆

    本文主要介紹了數(shù)據(jù)結(jié)構(gòu)-堆,文中通過圖片和大量的代碼講解的非常詳細(xì),需要學(xué)習(xí)的朋友可以參考下這篇文章,希望可以幫助到你
    2021-08-08
  • C/C++中組合詳解及其作用介紹

    C/C++中組合詳解及其作用介紹

    這篇文章主要介紹了C/C++中組合的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • QT進(jìn)行CSV文件初始化與讀寫操作

    QT進(jìn)行CSV文件初始化與讀寫操作

    這篇文章主要為大家詳細(xì)介紹了在QT環(huán)境中如何進(jìn)行CSV文件的初始化、寫入和讀取操作,本文為大家整理了相關(guān)的操作的多種方法,希望對(duì)大家有所幫助
    2025-04-04

最新評(píng)論