C++11智能指針

智能指針 unique_ptr shared_ptr weak_ptr


在C98中伤极,智能指針通過一個模板類型"auto_ptr"來實(shí)現(xiàn)。auto_ptr以對象的方式管理分配的內(nèi)存姨伤,并在適當(dāng)?shù)氖录?比如析構(gòu))哨坪,放釋所獲得的堆內(nèi)存。這種對內(nèi)存管理的方式只需要程序員將new操作返回的指針作為auto_ptr的初始值即可乍楚,程序員不用再顯示地調(diào)用delete当编,比如:

  auto_ptr(new int);

不過auto_ptr也有一些缺點(diǎn)(拷貝時返回一個左值,不能調(diào)用delete[]等)徒溪;


  • shared_ptr
    shared_ptr允許多個該智能指針共享的"擁有"同一堆分配對象的內(nèi)存忿偷,與unipue_ptr不同的是,由于在實(shí)現(xiàn)上采用了引用技術(shù)臊泌,所以一旦一個shared_ptr指針放棄了"所有權(quán)"鲤桥,其他的shared_ptr對對象內(nèi)存的引用并不會收到影響。只有在引用技術(shù)歸零的時候渠概,shared_ptr才會真正釋放所占有的堆內(nèi)存空間茶凳。
#include<iostream>
#include<memory>
using namespace std;

int main()
{
    shared_ptr<int> sp1(new int(22));
    shared_ptr<int> sp2 = sp1;

    cout << *sp1 << endl;               //22
    cout << *sp2 << endl;               //22

    sp1.reset();
    cout << *sp2 << endl;               //22
        return 0;
}

  • unique_ptr
    unique_ptr與所指對象的內(nèi)存綁定緊密,不能與其他unique_ptr類型的指針共享所指對象的內(nèi)存高氮,因?yàn)槊總€unique_ptr都是唯一的"擁有"所指向的對象內(nèi)存慧妄。這種"所有權(quán)"僅能通過標(biāo)準(zhǔn)庫的move函數(shù)來轉(zhuǎn)移,一旦"所有權(quán)"轉(zhuǎn)移成功了剪芍,原來的unique_ptr指針就失去了對象內(nèi)存的所有權(quán)塞淹,此時在使用已經(jīng)沒有內(nèi)存所有權(quán)的指針就會導(dǎo)致運(yùn)行時錯誤!W锕饱普!
#include<iostream>
#include<memory>
using namespace std;

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


    unique_ptr<int> up3 = move(up1);    //轉(zhuǎn)移up1的內(nèi)存所有權(quán)到up3
    cout << *up3 << endl;
    //cout << *up1 << endl;             //運(yùn)行出錯

    up3.reset();                        //顯示釋放內(nèi)存
    up1.reset();                        //不會導(dǎo)致運(yùn)行時錯誤
    cout << *up3 << endl;               //運(yùn)行錯誤

  return 0;
}

  • weak_ptr
    weak_ptr可以指向shared_ptr指針指向的對象內(nèi)存,但卻不擁有該內(nèi)存状共,而使用weak_ptr成員lock套耕,則可以返回其指向內(nèi)存的一個shared_ptr對象,且在所指對象內(nèi)存已經(jīng)無效時峡继,返回空指針冯袍,這在驗(yàn)證shared_ptr指針的有效性上會很有用。
#include<iostream>
#include<memory>
using namespace std;

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

int main()
{

    shared_ptr<int> sp1(new int(22));
    shared_ptr<int> sp2 = sp1;

    weak_ptr<int> wp = sp1;             //指向shared_ptr所指對象

    cout << *sp1 << endl;               //22
    cout << *sp2 << endl;               //22
    Check(wp);                          //still 22

    sp1.reset();
    cout << *sp2 << endl;               //22
    Check(wp);                          //still 22

    sp2.reset();
    Check(wp);                          //pointer is invalid
    return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市康愤,隨后出現(xiàn)的幾起案子儡循,更是在濱河造成了極大的恐慌,老刑警劉巖征冷,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件择膝,死亡現(xiàn)場離奇詭異,居然都是意外死亡检激,警方通過查閱死者的電腦和手機(jī)肴捉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叔收,“玉大人齿穗,你說我怎么就攤上這事〗翊” “怎么了缤灵?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵伦籍,是天一觀的道長蓝晒。 經(jīng)常有香客問我,道長帖鸦,這世上最難降的妖魔是什么芝薇? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮作儿,結(jié)果婚禮上洛二,老公的妹妹穿的比我還像新娘。我一直安慰自己攻锰,他們只是感情好晾嘶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著娶吞,像睡著了一般垒迂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妒蛇,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天机断,我揣著相機(jī)與錄音,去河邊找鬼绣夺。 笑死吏奸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陶耍。 我是一名探鬼主播奋蔚,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼烈钞!你這毒婦竟也來了泊碑?” 一聲冷哼從身側(cè)響起产上,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛾狗,沒想到半個月后晋涣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沉桌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年谢鹊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片留凭。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡佃扼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔼夜,到底是詐尸還是另有隱情兼耀,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布求冷,位于F島的核電站瘤运,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏匠题。R本人自食惡果不足惜拯坟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望韭山。 院中可真熱鬧郁季,春花似錦、人聲如沸钱磅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盖淡。三九已至年柠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間禁舷,已是汗流浹背彪杉。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牵咙,地道東北人派近。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像洁桌,于是被迫代替她去往敵國和親渴丸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348