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

C++中Boost的智能指針shared_ptr

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

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

#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同時擁有了implementation對象的訪問權(quán)限,且當sp1和sp2都釋放對該對象的所有權(quán)時,其所管理的的對象的內(nèi)存才被自動釋放。在共享對象的訪問權(quán)限同時,也實現(xiàn)了其內(nèi)存的自動管理。

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

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

上面的那個例子可以的圖示如下:

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

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

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

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

boost::shared_ptr的特點:

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

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

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

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

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

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

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

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

正確的用法為:

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

    淺談 C++17 里的 Visitor 模式

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

    C++標準庫bitset類型的簡單使用方法介紹

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

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

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

    C語言算法的時間復雜度和空間復雜度

    這篇文章主要介紹了C語言算法的時間復雜度和空間復雜度,算法在編寫成可執(zhí)行程序后,運行時需要耗費時間資源和空間(內(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ù)用于類對象初始化,類型包括默認構(gòu)造函數(shù)、參數(shù)化構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)等,默認構(gòu)造函數(shù)通常不需要參數(shù),編譯器會自動生成,除非存在其他構(gòu)造函數(shù),需要的朋友可以參考下
    2024-10-10
  • C++獲得文件狀態(tài)信息的方法

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

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

    C++ 兩個vector對象拼接方式

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

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

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

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

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

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

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

最新評論

太和县| 寿阳县| 区。| 金乡县| 高尔夫| 阿坝县| 鄂温| 屏山县| 社旗县| 南岸区| 宁国市| 象山县| 安西县| 静安区| 翁源县| 固原市| 华池县| 泾川县| 桑日县| 汶上县| 崇明县| 招远市| 新丰县| 天长市| 涟水县| 三江| 邯郸市| 青河县| 定兴县| 西青区| 舞钢市| 都昌县| 郴州市| 西盟| 荣成市| 高阳县| 阳谷县| 固原市| 南皮县| 金沙县| 遂昌县|