c++11智能指針(一) shared_ptr

智能指針是存儲動態(tài)分配對象指針的類,用于生命周期的控制。當(dāng)指針離開其作用域時赏陵,自動銷毀動態(tài)分配的空間,防止內(nèi)存泄漏饲漾。
使用智能指針需要包含頭文件#include<memory>

shared_ptr

std::shared_ptr采用引用計數(shù)蝙搔,每一個shared_ptr的拷貝都指向相同的內(nèi)容,當(dāng)最后一個shared_ptr析構(gòu)的時候考传,內(nèi)存被釋放

初始化shared_ptr對象

#include<iostream>
#include<memory>
 
int main(){
    std::shared_ptr<int> p1(new int(1)); //方式1
    std::shared_ptr<int> p2 = p1; //方式2
    std::shared_ptr<int> p3; 
//方式3 reset吃型,如果原有的shared_ptr不為空,會使原對象的引用計數(shù)減1
    p3.reset(new int(1));
       //方式4
    std::shared_ptr<int> p4 = std::make_shared<int>(2);

//使用方法例子:可以當(dāng)作一個指針使用
    std::cout << *p4 << std::endl;
    //std::shared_ptr<int> p4 = new int(1);
    if(p1) { //重載了bool操作符
        std::cout << "p is not null" << std::endl;
    }
    int* p = p1.get();//獲取原始指針 
    std::cout << *p << std::endl; 
}

指定刪除器

當(dāng)使用shared_ptr刪除數(shù)組時僚楞,需要指定刪除器
常用的寫法有以下幾種

#include<iostream>
#include<memory>
template<typename T>
std::shared_ptr<T> make_shared_array(size_t size) {
    return std::shared_ptr<T>(new T[size], std::default_delete<T[]>());
} 
int main(){
     //lambda
    std::shared_ptr<int> p(new int[10], [](int* p){delete [] p;});
       //指定默認(rèn)刪除器
    std::shared_ptr<int> p1(new int[10], std::default_delete<int[]>());
    //自定義泛型方法 
    std::shared_ptr<char> p2 = make_shared_array<char>(10);
}

使用的注意事項

不要用一個原始指針初始化多個shared_ptr

不要在函數(shù)實參中創(chuàng)建shared_ptr勤晚。
如下面中的例子枉层。

//不同編譯器執(zhí)行結(jié)果可能不同
//如果以new int -> 調(diào)用g() -> 創(chuàng)建shared_ptr的順序
//那么假如g()方法失敗,直接導(dǎo)致內(nèi)存泄漏 
void f(shared_ptr<int>(new int), g())

通過shared_from_this()返回this指針時赐写,不要作為shared_ptr返回览濒,因為this是一個裸指針葫录,可能會導(dǎo)致重復(fù)析構(gòu)妙真。如下面例子中灯萍,sp1和sp2重復(fù)析構(gòu)A對象,導(dǎo)致錯誤悠夯。如果需要返回this指針癌淮,可以通過繼承enable_shared_from_this類躺坟,調(diào)用方法shared_from_this實現(xiàn)沦补。如下面中注釋掉的寫法。
如果

#include<iostream>
#include<memory>
class A {
    public:
        std::shared_ptr<A> GetSelf() {
            return std::shared_ptr<A>(this);
        }
};
/*
class A :public std::enable_shared_from_this<A>{
    public:
        std::shared_ptr<A> GetSelf() {
            return shared_from_this();
        }
};
*/
int main(){
    std::shared_ptr<A> sp1(new A);
    std::shared_ptr<A> sp2 = sp1 -> GetSelf();
    
}

要注意循環(huán)引用帶來的內(nèi)存泄漏問題咪橙。如下面A與B循環(huán)引用夕膀,導(dǎo)致內(nèi)存泄漏

#include<iostream>
#include<memory>
struct A;
struct B;
struct A {
    std::shared_ptr<B> bptr;
    ~A() {
        std::cout << "A is delete" << std::endl;
    }
};
struct B {
    std::shared_ptr<A> aptr;
    ~B() {
        std::cout << "B is delete " << std::endl;
    }
};
int main(){
    std::shared_ptr<A> ap(new A);
    std::shared_ptr<B> bp(new B);
    ap->bptr = bp;
    bp->aptr = ap;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市美侦,隨后出現(xiàn)的幾起案子产舞,更是在濱河造成了極大的恐慌,老刑警劉巖菠剩,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件易猫,死亡現(xiàn)場離奇詭異,居然都是意外死亡具壮,警方通過查閱死者的電腦和手機准颓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棺妓,“玉大人攘已,你說我怎么就攤上這事×埽” “怎么了样勃?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長性芬。 經(jīng)常有香客問我峡眶,道長,這世上最難降的妖魔是什么植锉? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任辫樱,我火速辦了婚禮,結(jié)果婚禮上汽煮,老公的妹妹穿的比我還像新娘搏熄。我一直安慰自己棚唆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布心例。 她就那樣靜靜地躺著宵凌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪止后。 梳的紋絲不亂的頭發(fā)上瞎惫,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音译株,去河邊找鬼瓜喇。 笑死,一個胖子當(dāng)著我的面吹牛歉糜,可吹牛的內(nèi)容都是我干的乘寒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼匪补,長吁一口氣:“原來是場噩夢啊……” “哼伞辛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起夯缺,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚤氏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后踊兜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竿滨,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年捏境,在試婚紗的時候發(fā)現(xiàn)自己被綠了于游。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡典蝌,死狀恐怖曙砂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情骏掀,我是刑警寧澤鸠澈,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站截驮,受9級特大地震影響笑陈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜葵袭,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一坡锡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吵取,春花似錦皮官、人聲如沸捺氢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冰木,卻和暖如春踊沸,著一層夾襖步出監(jiān)牢的瞬間逼龟,已是汗流浹背腺律。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工谬返, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留遣铝,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親栓辜。 傳聞我的和親對象是個殘疾皇子藕甩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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

  • 1. 讓自己習(xí)慣C++ 條款01:視C++為一個語言聯(lián)邦 為了更好的理解C++概作,我們將C++分解為四個主要次語言:...
    Mr希靈閱讀 2,812評論 0 13
  • 1. 什么是智能指針骤素? 智能指針是行為類似于指針的類對象济竹,但這種對象還有其他功能霎槐。 2. 為什么設(shè)計智能指針? 引...
    MinoyJet閱讀 639評論 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,519評論 1 51
  • 導(dǎo)讀## 最近在補看《C++ Primer Plus》第六版蔼啦,這的確是本好書榆纽,其中關(guān)于智能指針的章節(jié)解析的非常清晰...
    小敏紙閱讀 2,004評論 1 12
  • 人格的超然獨立 生活的超逸 沐浴春風(fēng) 華彩 人生更多的可能性
    瓊sq閱讀 98評論 0 0