來自std::shared_ptr的問題渴逻,不僅僅是循環(huán)引用

《C++標(biāo)準(zhǔn)庫,2nd》用father/mother/kids的例子揭示了shared_ptr循環(huán)引用所導(dǎo)致的析構(gòu)失敗的問題妙啃,見5.2.2档泽。這最多造成memory leak,更致命的是造成app崩潰彬祖。如我所遇:

struct displayElementPts
{
    static std::shared_ptr< displayElementPts> instance(){...}
    void clear(){...}
}

class dialog{
    static std::shared_ptr< dialog > instance(){...}
    virtual void closeEvent(...){
      auto dis = displayElementPts::instance();
      dis->clear();
    }
}

在dialog關(guān)閉的時(shí)候茁瘦,會(huì)調(diào)用displayElementPts。
一般這是無害的储笑。但退出app的時(shí)候甜熔,對(duì)話框會(huì)調(diào)用closeEvent ,問題就在這里突倍,如果這個(gè)對(duì)話框從來就沒實(shí)例化過腔稀,就沒問題,如果正在顯示羽历,此時(shí)退出app焊虏,對(duì)話框會(huì)銷毀,并調(diào)用closeevent秕磷。dialog與displayElementPts一樣诵闭,也是單例方式創(chuàng)建的實(shí)例,由一個(gè)靜態(tài)的std::shared_ptr擁有著,他們的析構(gòu)次序是不確定的疏尿,所以程序會(huì)在退出的時(shí)候發(fā)生隨機(jī)的崩潰瘟芝。

輪到std::weak_ptr了,你雖不怎么關(guān)注它褥琐,或者幾乎沒用過它锌俱,但它并不像名字所示的那么弱。

class dialog{
    static std::shared_ptr< dialog > instance(){...}
    virtual void closeEvent(...){
      if(!m_wp.expired())
          m_wp->locked()->clear();
    }
dialog()
{
    //...
    m_wp = displayElementPts::instance();
}
private:
  std::weak_ptr< displayElementPts > m_wp;
}

先用expired()判斷單實(shí)例是否有效敌呈,再用locked取得有效的指針贸宏。就能避免獲取或者不能獲取有效實(shí)例的問題。

有沒有帶著鐐銬跳舞的感覺磕洪,其實(shí)不然吭练,只是在特殊的事件里才需要判斷,其它的位置析显,直接調(diào)用locked就好了线脚。

請(qǐng)安心享用std::shared_ptr吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叫榕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子姊舵,更是在濱河造成了極大的恐慌晰绎,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件括丁,死亡現(xiàn)場(chǎng)離奇詭異荞下,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)史飞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門尖昏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人构资,你說我怎么就攤上這事抽诉。” “怎么了吐绵?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵迹淌,是天一觀的道長。 經(jīng)常有香客問我己单,道長唉窃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任纹笼,我火速辦了婚禮纹份,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己蔓涧,他們只是感情好件已,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蠢笋,像睡著了一般拨齐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昨寞,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天瞻惋,我揣著相機(jī)與錄音,去河邊找鬼援岩。 笑死歼狼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的享怀。 我是一名探鬼主播羽峰,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼添瓷!你這毒婦竟也來了梅屉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鳞贷,失蹤者是張志新(化名)和其女友劉穎坯汤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搀愧,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惰聂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咱筛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搓幌。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖迅箩,靈堂內(nèi)的尸體忽然破棺而出溉愁,到底是詐尸還是另有隱情,我是刑警寧澤沙热,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布叉钥,位于F島的核電站,受9級(jí)特大地震影響篙贸,放射性物質(zhì)發(fā)生泄漏投队。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一爵川、第九天 我趴在偏房一處隱蔽的房頂上張望敷鸦。 院中可真熱鬧,春花似錦、人聲如沸扒披。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碟案。三九已至愿险,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間价说,已是汗流浹背辆亏。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鳖目,地道東北人扮叨。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像领迈,于是被迫代替她去往敵國和親彻磁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • 智能指針在C++11版本之后提供狸捅,包含在頭文件<memory>中衷蜓,shared_ptr、unique_ptr尘喝、we...
    宋大壯閱讀 3,229評(píng)論 1 1
  • 簡單總結(jié)恍箭,詳見參考資料。 引用計(jì)數(shù)的實(shí)現(xiàn)方式 引用計(jì)數(shù)是與對(duì)象綁定的瞧省,并且可能有多個(gè)shared_ptr綁定同一對(duì)...
    丑角的晨歌閱讀 1,245評(píng)論 0 0
  • #include #include #include <memory> class TestB; class Te...
    大嘯閱讀 628評(píng)論 0 0
  • 我們知道,shared_ptr是通過引用計(jì)數(shù)的方式來管理資源鳍贾,那么現(xiàn)在的問題是鞍匾,這個(gè)計(jì)數(shù)對(duì)象(counter)什么...
    FearlessAG閱讀 3,919評(píng)論 1 3
  • 1.std::shared_ptr 的實(shí)現(xiàn)是使用的引用計(jì)數(shù),其基本結(jié)構(gòu)為(非具體實(shí)現(xiàn),大致結(jié)構(gòu)) 也就是一個(gè)每個(gè) ...
    筆墨情_3643閱讀 209評(píng)論 0 0