C++智能指針模版類

指針的缺陷

  using std::string;
  void remodel(string &str) {
      string *ps = new string (str);
      str =  *ps;
      return ;
  } 

你可能已經(jīng)發(fā)現(xiàn)了其中的缺陷鸟妙。remodel函數(shù)每次被調(diào)用時都會申請一段內(nèi)存,但是從不收回快压。這樣會導(dǎo)致內(nèi)存泄漏圆仔。解決方法是在return語句前添加釋放內(nèi)存的語句。

  delete ps;

但是當(dāng)遇到下面這種情況時蔫劣,你可能會忘了釋放內(nèi)存坪郭。

  using std::string;
  void remodel(string &str) {
      string *ps = new string (str);
      if(wrong()) {//we get something wrong
          throw exception();
      }
      str = *ps;
      delete ps;
      return;
  }

如果程序出現(xiàn)異常,throw將直接實現(xiàn)跳轉(zhuǎn)脉幢,delete語句不會被執(zhí)行歪沃,內(nèi)存無法釋放嗦锐。
常用的智能指針類
=============
為了解決這個問題,STL設(shè)計了三種智能指針模版:auto_ptr沪曙、unique_ptr和shared_ptr奕污。可以將new獲得的地址賦給這種對象液走。
要使用智能指針模版碳默,首先需要包含頭文件memory。

  #include <memory>

以下是修改過的remodel函數(shù)

  using std::string;
  using std::auto_ptr;
  void remodel(string &str) {
      auto_ptr <string> ps (new string (str));
      if(wrong())
          throw exception();
      str = *ps;
      return;
  }

每個智能指針都將存放在一個代碼塊里缘眶,這樣離開代碼塊時嘱根,指針將過期。
智能指針模版類的定義方式?jīng)Q定了智能指針對象很多方面都類似常規(guī)指針比如可以訪問結(jié)構(gòu)成員巷懈、賦值給指向相同類型的常用指針该抒。
三種智能指針的應(yīng)用范圍
==================
首先我們來看一段代碼

  auto_ptr<string> p1(new string("auto"));
  auto_ptr<string> p2;
  p2 = p1;

在賦值語句中,p2接管了string對象的所有權(quán)后顶燕,p1的所有權(quán)將被剝奪凑保。這是智能指針的一個特性,以防止p1和p2的析構(gòu)函數(shù)銷毀相同的對象涌攻。但是如果程序隨后想要用到p1對象欧引,則會發(fā)生錯誤。
unique_ptr和shared_ptr分別以兩種不同的方式解決了這個問題癣漆。在unique_ptr中维咸,賦值語句將會出現(xiàn)報錯信息剂买。當(dāng)程序試圖將一個unique_ptr賦給另外一個的時候惠爽,如果源unique_ptr是一個臨時右值,很快會被銷毀瞬哼,沒有機會使用它訪問無效的數(shù)據(jù)婚肆,編譯器便不會報錯。當(dāng)如果你要執(zhí)意執(zhí)行賦值時坐慰,而編譯器又會出現(xiàn)報錯時较性,請使用move函數(shù),但是需要處理好對象間的關(guān)系结胀。

  unique_ptr <int> p1(new string("unique"));
  unique_ptr <int> p2;
  p2 = move(p1);

而shared_ptr則以一種更智能的方式來解決這類問題赞咙。shared_ptr會跟蹤引用特定對象的智能指針數(shù)。這成為引用計數(shù)糟港。如賦值時攀操,指針計數(shù)+1,指針過期時秸抚,計數(shù)-1速和。僅當(dāng)最后一個指針過期時歹垫,才調(diào)用delete。
如果程序要使用指向同一個對象的多個指針颠放,應(yīng)選擇shared_ptr排惨。如用一個指針數(shù)組指示數(shù)據(jù)并輔助用一些指針來標(biāo)示特定元素(最大最小值)。
這種情況就需要shared_ptr碰凶。而在其他情況下暮芭,不需要多個指向同一個對象的指針,則建議使用unique_ptr欲低。實際上在C++11中谴麦,auto_ptr已經(jīng)被摒棄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伸头,一起剝皮案震驚了整個濱河市匾效,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恤磷,老刑警劉巖面哼,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扫步,居然都是意外死亡魔策,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門河胎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闯袒,“玉大人,你說我怎么就攤上這事游岳≌遥” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵胚迫,是天一觀的道長喷户。 經(jīng)常有香客問我,道長访锻,這世上最難降的妖魔是什么褪尝? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮期犬,結(jié)果婚禮上河哑,老公的妹妹穿的比我還像新娘。我一直安慰自己龟虎,他們只是感情好璃谨,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遣总,像睡著了一般睬罗。 火紅的嫁衣襯著肌膚如雪轨功。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天容达,我揣著相機與錄音古涧,去河邊找鬼。 笑死花盐,一個胖子當(dāng)著我的面吹牛羡滑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播算芯,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼柒昏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了熙揍?” 一聲冷哼從身側(cè)響起职祷,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎届囚,沒想到半個月后有梆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡意系,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年泥耀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛔添。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡痰催,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迎瞧,到底是詐尸還是另有隱情夸溶,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布夹攒,位于F島的核電站蜘醋,受9級特大地震影響胁塞,放射性物質(zhì)發(fā)生泄漏咏尝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一啸罢、第九天 我趴在偏房一處隱蔽的房頂上張望编检。 院中可真熱鬧,春花似錦扰才、人聲如沸允懂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蕾总。三九已至粥航,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間生百,已是汗流浹背递雀。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚀浆,地道東北人缀程。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像市俊,于是被迫代替她去往敵國和親杨凑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

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

  • 導(dǎo)讀## 最近在補看《C++ Primer Plus》第六版摆昧,這的確是本好書撩满,其中關(guān)于智能指針的章節(jié)解析的非常清晰...
    小敏紙閱讀 1,997評論 1 12
  • 1. 什么是智能指針? 智能指針是行為類似于指針的類對象绅你,但這種對象還有其他功能鹦牛。 2. 為什么設(shè)計智能指針? 引...
    MinoyJet閱讀 636評論 0 1
  • 原作者:Babu_Abdulsalam 本文翻譯自CodeProject勇吊,轉(zhuǎn)載請注明出處曼追。 引入### Ooops...
    卡巴拉的樹閱讀 30,078評論 13 74
  • C++智能指針 原文鏈接:http://blog.csdn.net/xiaohu2022/article/deta...
    小白將閱讀 6,858評論 2 21
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評論 1 51