国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

智能指針shared_ptr的用法

2019-11-11 00:59:07
字體:
供稿:網(wǎng)友

智能指針shared_ptr的用法

2016-12-03 15:39 by jiayayao, 360 閱讀, 0 評論, 收藏, 編輯

  為了解決C++內(nèi)存泄漏的問題,C++11引入了智能指針(Smart Pointer)。

  智能指針的原理是,接受一個(gè)申請好的內(nèi)存地址,構(gòu)造一個(gè)保存在棧上的智能指針對象,當(dāng)程序退出棧的作用域范圍后,由于棧上的變量自動被銷毀,智能指針內(nèi)部保存的內(nèi)存也就被釋放掉了(除非將智能指針保存起來)。

  C++11提供了三種智能指針:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用時(shí)需添加頭文件<memory>:

      #include <memory>

  shared_ptr使用引用計(jì)數(shù),每一個(gè)shared_ptr的拷貝都指向相同的內(nèi)存。每使用他一次,內(nèi)部的引用計(jì)數(shù)加1,每析構(gòu)一次,內(nèi)部的引用計(jì)數(shù)減1,減為0時(shí),刪除所指向的堆內(nèi)存。

shared_ptr的基本用法初始化

  可以通過構(gòu)造函數(shù)、std::make_shared<T>輔助函數(shù)和reset方法來初始化shared_ptr:

    std::shared_ptr<int> p(new int(1));    std::shared_ptr<int> p2 = p;    std::shared_ptr<int> p3 = std::make_shared<int>(5);    std::shared_ptr<int> ptr;    ptr.reset(new int(1));    if (ptr) {        cout << "ptr is not null";    }

   注意,不能將一個(gè)原始指針直接賦值給一個(gè)智能指針,如下所示,原因是一個(gè)是類,一個(gè)是指針。

    std::shared_ptr<int> p4 = new int(1);// error

  當(dāng)智能指針中有值的時(shí)候,調(diào)用reset會使引用計(jì)數(shù)減1.

獲取原始指針  
    std::shared_ptr<int> p4(new int(5));    int *pInt = p4.get();指定刪除器

  智能指針可以指定刪除器,當(dāng)智能指針的引用計(jì)數(shù)為0時(shí),自動調(diào)用指定的刪除器來釋放內(nèi)存。std::shared_ptr可以指定刪除器的一個(gè)原因是其默認(rèn)刪除器不支持?jǐn)?shù)組對象,這一點(diǎn)需要注意。

  2. 使用shared_ptr需要注意的問題

  但凡一些高級的用法,使用時(shí)都有不少陷阱。

不要用一個(gè)原始指針初始化多個(gè)shared_ptr,原因在于,會造成二次銷毀,如下所示:
    int *p5 = new int;    std::shared_ptr<int> p6(p5);    std::shared_ptr<int> p7(p5);// logic error不要在函數(shù)實(shí)參中創(chuàng)建shared_ptr。因?yàn)镃++的函數(shù)參數(shù)的計(jì)算順序在不同的編譯器下是不同的。正確的做法是先創(chuàng)建好,然后再傳入。
    function(shared_ptr<int>(new int), g());禁止通過shared_from_this()返回this指針,這樣做可能也會造成二次析構(gòu)。避免循環(huán)引用。智能指針最大的一個(gè)陷阱是循環(huán)引用,循環(huán)引用會導(dǎo)致內(nèi)存泄漏。解決方法是AStruct或BStruct改為weak_ptr。
struct AStruct;struct BStruct;struct AStruct {    std::shared_ptr<BStruct> bPtr;    ~AStruct() { cout << "AStruct is deleted!"<<endl; }};struct BStruct {    std::shared_ptr<AStruct> APtr;    ~BStruct() { cout << "BStruct is deleted!" << endl; }};void TestLooPReference(){    std::shared_ptr<AStruct> ap(new AStruct);    std::shared_ptr<BStruct> bp(new BStruct);    ap->bPtr = bp;    bp->APtr = ap;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黄山市| 灵丘县| 昂仁县| 永宁县| 怀安县| 荣昌县| 通辽市| 金秀| 小金县| 西乌珠穆沁旗| 长治县| 左权县| 通河县| 金山区| 方山县| 阳原县| 陇川县| 婺源县| 桓台县| 嵊泗县| 比如县| 邯郸县| 石渠县| 定边县| 常熟市| 方正县| 临江市| 宜川县| 陈巴尔虎旗| 视频| 定兴县| 潜山县| 娱乐| 隆昌县| 巴林左旗| 辽宁省| 稻城县| 眉山市| 嘉黎县| 合江县| 顺义区|