最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中Boost的智能指針shared_ptr

 更新時(shí)間:2022年07月05日 09:35:35   作者:天方  
這篇文章介紹了C++中Boost的智能指針shared_ptr,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

boost::scoped_ptr雖然簡(jiǎn)單易用,但它不能共享所有權(quán)的特性卻大大限制了其使用范圍,而boost::shared_ptr可以解決這一局限。顧名思義,boost::shared_ptr是可以共享所有權(quán)的智能指針,首先讓我們通過(guò)一個(gè)例子看看它的基本用法:

#include <string>
#include <iostream>
#include <boost/shared_ptr.hpp>

class implementation
{
public:
    ~implementation() { std::cout <<"destroying implementation\n"; }
    void do_something() { std::cout << "did something\n"; }
};

void test()
{
    boost::shared_ptr<implementation> sp1(new implementation());
    std::cout<<"The Sample now has "<<sp1.use_count()<<" references\n";

    boost::shared_ptr<implementation> sp2 = sp1;
    std::cout<<"The Sample now has "<<sp2.use_count()<<" references\n";
    
    sp1.reset();
    std::cout<<"After Reset sp1. The Sample now has "<<sp2.use_count()<<" references\n";

    sp2.reset();
    std::cout<<"After Reset sp2.\n";
}

void main()
{
    test();
}

該程序的輸出結(jié)果如下:

The Sample now has 1 references
The Sample now has 2 references
After Reset sp1. The Sample now has 1 references
destroying implementation
After Reset sp2.

可以看到,boost::shared_ptr指針sp1和sp2同時(shí)擁有了implementation對(duì)象的訪問(wèn)權(quán)限,且當(dāng)sp1和sp2都釋放對(duì)該對(duì)象的所有權(quán)時(shí),其所管理的的對(duì)象的內(nèi)存才被自動(dòng)釋放。在共享對(duì)象的訪問(wèn)權(quán)限同時(shí),也實(shí)現(xiàn)了其內(nèi)存的自動(dòng)管理。

boost::shared_ptr的內(nèi)存管理機(jī)制:

boost::shared_ptr的管理機(jī)制其實(shí)并不復(fù)雜,就是對(duì)所管理的對(duì)象進(jìn)行了引用計(jì)數(shù),當(dāng)新增一個(gè)boost::shared_ptr對(duì)該對(duì)象進(jìn)行管理時(shí),就將該對(duì)象的引用計(jì)數(shù)加一;減少一個(gè)boost::shared_ptr對(duì)該對(duì)象進(jìn)行管理時(shí),就將該對(duì)象的引用計(jì)數(shù)減一,如果該對(duì)象的引用計(jì)數(shù)為0的時(shí)候,說(shuō)明沒(méi)有任何指針對(duì)其管理,才調(diào)用delete釋放其所占的內(nèi)存。

上面的那個(gè)例子可以的圖示如下:

  • sp1對(duì)implementation對(duì)象進(jìn)行管理,其引用計(jì)數(shù)為1

  • 增加sp2對(duì)implementation對(duì)象進(jìn)行管理,其引用計(jì)數(shù)增加為2

  • sp1釋放對(duì)implementation對(duì)象進(jìn)行管理,其引用計(jì)數(shù)變?yōu)?

  • sp2釋放對(duì)implementation對(duì)象進(jìn)行管理,其引用計(jì)數(shù)變?yōu)?,該對(duì)象被自動(dòng)刪除

boost::shared_ptr的特點(diǎn):

和前面介紹的boost::scoped_ptr相比,boost::shared_ptr可以共享對(duì)象的所有權(quán),因此其使用范圍基本上沒(méi)有什么限制(還是有一些需要遵循的使用規(guī)則,下文中介紹),自然也可以使用在stl的容器中。另外它還是線程安全的,這點(diǎn)在多線程程序中也非常重要。

boost::shared_ptr的使用規(guī)則:

boost::shared_ptr并不是絕對(duì)安全,下面幾條規(guī)則能使我們更加安全的使用boost::shared_ptr:

  • 避免對(duì)shared_ptr所管理的對(duì)象的直接內(nèi)存管理操作,以免造成該對(duì)象的重釋放

  • shared_ptr并不能對(duì)循環(huán)引用的對(duì)象內(nèi)存自動(dòng)管理(這點(diǎn)是其它各種引用計(jì)數(shù)管理內(nèi)存方式的通病)。

  • 不要構(gòu)造一個(gè)臨時(shí)的shared_ptr作為函數(shù)的參數(shù)。

如下列代碼則可能導(dǎo)致內(nèi)存泄漏:

void test()
{
    foo(boost::shared_ptr<implementation>(new    implementation()),g());
}

正確的用法為:

void test()
{
    boost::shared_ptr<implementation> sp    (new implementation());
    foo(sp,g());
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談 C++17 里的 Visitor 模式

    淺談 C++17 里的 Visitor 模式

    Visitor模式經(jīng)常用于將更新的設(shè)計(jì)封裝在一個(gè)類中,并且由待更改的類提供一個(gè)接受接口,其關(guān)鍵技術(shù)在于雙分派技術(shù),本文主要介紹 C++17 里的 Visitor 模式的相關(guān)資料,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09
  • C++標(biāo)準(zhǔn)庫(kù)bitset類型的簡(jiǎn)單使用方法介紹

    C++標(biāo)準(zhǔn)庫(kù)bitset類型的簡(jiǎn)單使用方法介紹

    這篇文章主要介紹了C++標(biāo)準(zhǔn)庫(kù)bitset類型的簡(jiǎn)單使用方法,需要的朋友可以參考下
    2017-07-07
  • 利用C語(yǔ)言實(shí)現(xiàn)單詞文本計(jì)數(shù)

    利用C語(yǔ)言實(shí)現(xiàn)單詞文本計(jì)數(shù)

    這篇文章主要為大家詳細(xì)介紹了如何編寫一個(gè)C語(yǔ)言程序,用于統(tǒng)計(jì)一個(gè)文本文件中每個(gè)單詞出現(xiàn)的次數(shù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • C語(yǔ)言算法的時(shí)間復(fù)雜度和空間復(fù)雜度

    C語(yǔ)言算法的時(shí)間復(fù)雜度和空間復(fù)雜度

    這篇文章主要介紹了C語(yǔ)言算法的時(shí)間復(fù)雜度和空間復(fù)雜度,算法在編寫成可執(zhí)行程序后,運(yùn)行時(shí)需要耗費(fèi)時(shí)間資源和空間(內(nèi)存)資源,更多相關(guān)需要的朋友可以參考一下
    2022-07-07
  • C++中的6種構(gòu)造函數(shù)舉例詳解

    C++中的6種構(gòu)造函數(shù)舉例詳解

    這篇文章主要介紹了C++中的6種構(gòu)造函數(shù)的相關(guān)資料,C++中構(gòu)造函數(shù)用于類對(duì)象初始化,類型包括默認(rèn)構(gòu)造函數(shù)、參數(shù)化構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)等,默認(rèn)構(gòu)造函數(shù)通常不需要參數(shù),編譯器會(huì)自動(dòng)生成,除非存在其他構(gòu)造函數(shù),需要的朋友可以參考下
    2024-10-10
  • C++獲得文件狀態(tài)信息的方法

    C++獲得文件狀態(tài)信息的方法

    這篇文章主要介紹了C++獲得文件狀態(tài)信息的方法,包括文件狀態(tài)信息、文件所在磁盤盤符、文件創(chuàng)建時(shí)間、訪問(wèn)時(shí)間及修改日期等,需要的朋友可以參考下
    2015-07-07
  • C++ 兩個(gè)vector對(duì)象拼接方式

    C++ 兩個(gè)vector對(duì)象拼接方式

    這篇文章主要介紹了C++ 兩個(gè)vector對(duì)象拼接方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • VC++ 使用 _access函數(shù)判斷文件或文件夾是否存在

    VC++ 使用 _access函數(shù)判斷文件或文件夾是否存在

    這篇文章主要介紹了VC++ 使用 _access函數(shù)判斷文件或文件夾是否存在的相關(guān)資料,需要的朋友可以參考下
    2015-10-10
  • C++函數(shù)重載的定義與原因詳解

    C++函數(shù)重載的定義與原因詳解

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • c++隱式類型轉(zhuǎn)換示例分享

    c++隱式類型轉(zhuǎn)換示例分享

    這篇文章主要介紹了c++隱式類型轉(zhuǎn)換的二個(gè)示例,需要的朋友可以參考下
    2014-03-03

最新評(píng)論

辽阳县| 红河县| 蒙自县| 乌兰县| 宿迁市| 大丰市| 峨山| 齐齐哈尔市| 罗田县| 大安市| 五台县| 武平县| 嵩明县| 郯城县| 务川| 余干县| 新蔡县| 福建省| 瓮安县| 桐城市| 沈丘县| 高州市| 娱乐| 墨竹工卡县| 苍梧县| 紫阳县| 榆林市| 芒康县| 洪江市| 田阳县| 井冈山市| 当涂县| 佛学| 介休市| 建水县| 江山市| 天峻县| 孟津县| 乐亭县| 武山县| 陆良县|