C++11智能指針

概述

智能指針主要用于管理在堆上分配的內(nèi)存瓶盛,它將普通的指針?lè)庋b為一個(gè)棧對(duì)象。當(dāng)棧對(duì)象的生存周期結(jié)束后示罗,會(huì)在析構(gòu)函數(shù)中釋放掉申請(qǐng)的內(nèi)存惩猫,從而防止內(nèi)存泄漏。
C++里面的四個(gè)智能指針: auto_ptr, unique_ptr,shared_ptr, weak_ptr蚜点,其中后三個(gè)是C++11支持轧房,并且第一個(gè)已經(jīng)被C++11棄用。

原理

智能指針的作用是管理一個(gè)指針绍绘,因?yàn)榇嬖谝韵逻@種情況:申請(qǐng)的空間在函數(shù)結(jié)束時(shí)忘記釋放奶镶,造成內(nèi)存泄漏迟赃。使用智能指針可以很大程度上的避免這個(gè)問(wèn)題,因?yàn)橹悄苤羔樉褪且粋€(gè)類厂镇,當(dāng)超出了類的作用域是纤壁,類會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù),析構(gòu)函數(shù)會(huì)自動(dòng)釋放資源捺信。所以智能指針的作用原理就是在函數(shù)結(jié)束時(shí)自動(dòng)釋放內(nèi)存空間酌媒,不需要手動(dòng)釋放內(nèi)存空間。

技術(shù)細(xì)節(jié)及使用方法

1.auto_ptr

所有權(quán)模式残黑,C++11中已經(jīng)廢棄

2.unique_ptr

unique_ptr實(shí)現(xiàn)獨(dú)占式擁有或嚴(yán)格擁有概念馍佑,保證同一時(shí)間內(nèi)只有一個(gè)智能指針可以指向該對(duì)象。它對(duì)于避免資源泄露特別有用梨水。

unique_ptr<int> p1(new int(1));       //初始化方式1拭荤,注意類的構(gòu)造函數(shù)初始化方式
unique_ptr<int> p2,p3;
p2 = unique_ptr<int>(new int(3));   //初始化方式2,注意這里用來(lái)初始化時(shí)使用的unique_ptr只是一個(gè)臨時(shí)右值疫诽,初始化完就沒(méi)有歸屬了舅世,可以這么用
p3 = move(p2);                        //初始化方式3,將另一個(gè)unique_ptr的所有權(quán)轉(zhuǎn)讓給當(dāng)前unique_ptr
p2 = unique_ptr<int>(new int(5));   //如果這里不再次初始化p2,后面不能訪問(wèn)p2奇徒,因?yàn)閜2是空指針了
cout<<*p1<<*p2<<*p3<<endl;     //輸出153
3.shared_ptr

shared_ptr實(shí)現(xiàn)共享式擁有概念雏亚。多個(gè)智能指針可以指向相同對(duì)象,該對(duì)象和其相關(guān)資源會(huì)在“最后一個(gè)引用被銷毀”時(shí)候釋放摩钙。從名字share就可以看出了資源可以被多個(gè)指針共享罢低,它使用計(jì)數(shù)機(jī)制來(lái)表明資源被幾個(gè)指針共享∨值眩可以通過(guò)成員函數(shù)use_count()來(lái)查看資源的所有者個(gè)數(shù)网持。除了可以通過(guò)new來(lái)構(gòu)造,還可以通過(guò)傳入auto_ptr, unique_ptr,weak_ptr來(lái)構(gòu)造长踊。當(dāng)我們調(diào)用release()時(shí)功舀,當(dāng)前指針會(huì)釋放資源所有權(quán),計(jì)數(shù)減一身弊。當(dāng)計(jì)數(shù)等于0時(shí)辟汰,資源會(huì)被釋放。
shared_ptr 是為了解決 auto_ptr 在對(duì)象所有權(quán)上的局限性(auto_ptr 是獨(dú)占的), 在使用引用計(jì)數(shù)的機(jī)制上提供了可以共享所有權(quán)的智能指針阱佛。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帖汞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凑术,更是在濱河造成了極大的恐慌翩蘸,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件麦萤,死亡現(xiàn)場(chǎng)離奇詭異鹿鳖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)壮莹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)翅帜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人命满,你說(shuō)我怎么就攤上這事涝滴。” “怎么了胶台?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵歼疮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我诈唬,道長(zhǎng)韩脏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任铸磅,我火速辦了婚禮赡矢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘阅仔。我一直安慰自己吹散,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布八酒。 她就那樣靜靜地躺著空民,像睡著了一般。 火紅的嫁衣襯著肌膚如雪羞迷。 梳的紋絲不亂的頭發(fā)上界轩,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音闭树,去河邊找鬼耸棒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛报辱,可吹牛的內(nèi)容都是我干的与殃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼碍现,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼幅疼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起昼接,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤爽篷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后慢睡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體逐工,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铡溪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泪喊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棕硫。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖袒啼,靈堂內(nèi)的尸體忽然破棺而出哈扮,到底是詐尸還是另有隱情,我是刑警寧澤蚓再,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布滑肉,位于F島的核電站,受9級(jí)特大地震影響摘仅,放射性物質(zhì)發(fā)生泄漏靶庙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一实檀、第九天 我趴在偏房一處隱蔽的房頂上張望惶洲。 院中可真熱鬧,春花似錦膳犹、人聲如沸恬吕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铐料。三九已至,卻和暖如春豺旬,著一層夾襖步出監(jiān)牢的瞬間钠惩,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸣哀。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像愧沟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鲤遥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345