c++11 智能指針 unique_ptr炕淮、shared_ptr與weak_ptr

原文地址:https://www.cnblogs.com/lsgxeva/p/7788061.html

C++11中有unique_ptr拆火、shared_ptr與weak_ptr等智能指針(smart pointer),定義在<memory>中涂圆。

可以對(duì)動(dòng)態(tài)資源進(jìn)行管理们镜,保證任何情況下,已構(gòu)造的對(duì)象最終會(huì)銷毀润歉,即它的析構(gòu)函數(shù)最終會(huì)被調(diào)用模狭。

unique_ptr

unique_ptr持有對(duì)對(duì)象的獨(dú)有權(quán),同一時(shí)刻只能有一個(gè)unique_ptr指向給定對(duì)象(通過禁止拷貝語(yǔ)義踩衩、只有移動(dòng)語(yǔ)義來實(shí)現(xiàn))嚼鹉。

unique_ptr指針本身的生命周期:從unique_ptr指針創(chuàng)建時(shí)開始贩汉,直到離開作用域。

離開作用域時(shí)锚赤,若其指向?qū)ο笃ノ瑁瑒t將其所指對(duì)象銷毀(默認(rèn)使用delete操作符,用戶可指定其他操作)线脚。

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include <map>


void mytest()
{
    std::unique_ptr<int> up1(new int(11));   // 無法復(fù)制的unique_ptr
    //unique_ptr<int> up2 = up1;        // err, 不能通過編譯
    std::cout << *up1 << std::endl;   // 11

    std::unique_ptr<int> up3 = std::move(up1);    // 現(xiàn)在p3是數(shù)據(jù)的唯一的unique_ptr

    std::cout << *up3 << std::endl;   // 11
    //std::cout << *up1 << std::endl;   // err, 運(yùn)行時(shí)錯(cuò)誤
    up3.reset();            // 顯式釋放內(nèi)存
    up1.reset();            // 不會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤
    //std::cout << *up3 << std::endl;   // err, 運(yùn)行時(shí)錯(cuò)誤

    std::unique_ptr<int> up4(new int(22));   // 無法復(fù)制的unique_ptr
    up4.reset(new int(44)); //"綁定"動(dòng)態(tài)對(duì)象
    std::cout << *up4 << std::endl; // 44

    up4 = nullptr;//顯式銷毀所指對(duì)象赐稽,同時(shí)智能指針變?yōu)榭罩羔槨Ecup4.reset()等價(jià)

    std::unique_ptr<int> up5(new int(55));
    int *p = up5.release(); //只是釋放控制權(quán)浑侥,不會(huì)釋放內(nèi)存
    std::cout << *p << std::endl;
    //cout << *up5 << endl; // err, 運(yùn)行時(shí)錯(cuò)誤
    delete p; //釋放堆區(qū)資源

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}
shared_ptr

shared_ptr允許多個(gè)該智能指針共享第“擁有”同一堆分配對(duì)象的內(nèi)存又憨,這通過引用計(jì)數(shù)(reference counting)實(shí)現(xiàn),會(huì)記錄有多少個(gè)shared_ptr共同指向一個(gè)對(duì)象锭吨,一旦最后一個(gè)這樣的指針被銷毀蠢莺,也就是一旦某個(gè)對(duì)象的引用計(jì)數(shù)變?yōu)?,這個(gè)對(duì)象會(huì)被自動(dòng)刪除零如。

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include <map>


void mytest()
{
    std::shared_ptr<int> sp1(new int(22));
    std::shared_ptr<int> sp2 = sp1;
    std::cout << "cout: " << sp2.use_count() << std::endl; // 打印引用計(jì)數(shù)

    std::cout << *sp1 << std::endl;
    std::cout << *sp2 << std::endl;

    sp1.reset(); // 顯示讓引用計(jì)數(shù)減一
    std::cout << "count: " << sp2.use_count() << std::endl; // 打印引用計(jì)數(shù)

    std::cout << *sp2 << std::endl; // 22

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}
weak_ptr

weak_ptr是為配合shared_ptr而引入的一種智能指針來協(xié)助shared_ptr工作躏将,它可以從一個(gè)shared_ptr或另一個(gè)weak_ptr對(duì)象構(gòu)造,它的構(gòu)造和析構(gòu)不會(huì)引起引用計(jì)數(shù)的增加或減少考蕾。沒有重載 * 和 -> 但可以使用lock獲得一個(gè)可用的shared_ptr對(duì)象

weak_ptr的使用更為復(fù)雜一點(diǎn)祸憋,它可以指向shared_ptr指針指向的對(duì)象內(nèi)存,卻并不擁有該內(nèi)存肖卧,而使用weak_ptr成員lock蚯窥,則可返回其指向內(nèi)存的一個(gè)share_ptr對(duì)象,且在所指對(duì)象內(nèi)存已經(jīng)無效時(shí)塞帐,返回指針空值nullptr拦赠。

注意:weak_ptr并不擁有資源的所有權(quán),所以不能直接使用資源葵姥。
可以從一個(gè)weak_ptr構(gòu)造一個(gè)shared_ptr以取得共享資源的所有權(quán)荷鼠。

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include <map>

void check(std::weak_ptr<int> &wp)
{
    std::shared_ptr<int> sp = wp.lock(); // 轉(zhuǎn)換為shared_ptr<int>
    if (sp != nullptr)
    {
        std::cout << "still: " << *sp << std::endl;
    } 
    else
    {
        std::cout << "still: " << "pointer is invalid" << std::endl;
    }
}


void mytest()
{
    std::shared_ptr<int> sp1(new int(22));
    std::shared_ptr<int> sp2 = sp1;
    std::weak_ptr<int> wp = sp1; // 指向shared_ptr<int>所指對(duì)象

    std::cout << "count: " << wp.use_count() << std::endl; // count: 2
    std::cout << *sp1 << std::endl; // 22
    std::cout << *sp2 << std::endl; // 22
    check(wp); // still: 22
    
    sp1.reset();
    std::cout << "count: " << wp.use_count() << std::endl; // count: 1
    std::cout << *sp2 << std::endl; // 22
    check(wp); // still: 22

    sp2.reset();
    std::cout << "count: " << wp.use_count() << std::endl; // count: 0
    check(wp); // still: pointer is invalid

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市榔幸,隨后出現(xiàn)的幾起案子允乐,更是在濱河造成了極大的恐慌,老刑警劉巖削咆,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牍疏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拨齐,警方通過查閱死者的電腦和手機(jī)鳞陨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奏黑,“玉大人炊邦,你說我怎么就攤上這事编矾∈焓罚” “怎么了馁害?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蹂匹。 經(jīng)常有香客問我碘菜,道長(zhǎng),這世上最難降的妖魔是什么限寞? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任忍啸,我火速辦了婚禮,結(jié)果婚禮上履植,老公的妹妹穿的比我還像新娘计雌。我一直安慰自己,他們只是感情好玫霎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布凿滤。 她就那樣靜靜地躺著,像睡著了一般庶近。 火紅的嫁衣襯著肌膚如雪翁脆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天鼻种,我揣著相機(jī)與錄音反番,去河邊找鬼。 笑死叉钥,一個(gè)胖子當(dāng)著我的面吹牛罢缸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播投队,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼祖能,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蛾洛?” 一聲冷哼從身側(cè)響起养铸,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轧膘,沒想到半個(gè)月后钞螟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谎碍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年鳞滨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟆淀。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拯啦,死狀恐怖澡匪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情褒链,我是刑警寧澤唁情,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站甫匹,受9級(jí)特大地震影響甸鸟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兵迅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一抢韭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恍箭,春花似錦刻恭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至勉抓,卻和暖如春贾漏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藕筋。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工纵散, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隐圾。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓伍掀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親暇藏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜜笤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 原作者:Babu_Abdulsalam 本文翻譯自CodeProject,轉(zhuǎn)載請(qǐng)注明出處盐碱。 引入### Ooops...
    卡巴拉的樹閱讀 30,078評(píng)論 13 74
  • 導(dǎo)讀## 最近在補(bǔ)看《C++ Primer Plus》第六版把兔,這的確是本好書,其中關(guān)于智能指針的章節(jié)解析的非常清晰...
    小敏紙閱讀 1,997評(píng)論 1 12
  • 1. 什么是智能指針瓮顽? 智能指針是行為類似于指針的類對(duì)象县好,但這種對(duì)象還有其他功能。 2. 為什么設(shè)計(jì)智能指針暖混? 引...
    MinoyJet閱讀 637評(píng)論 0 1
  • C++智能指針 原文鏈接:http://blog.csdn.net/xiaohu2022/article/deta...
    小白將閱讀 6,859評(píng)論 2 21
  • 強(qiáng)類型枚舉 枚舉:分門別類與數(shù)值的名字 枚舉類型是C及C++中一個(gè)基本的內(nèi)置類型缕贡,不過也是一個(gè)有點(diǎn)"奇怪"的類型。...
    認(rèn)真學(xué)計(jì)算機(jī)閱讀 2,699評(píng)論 0 3