青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++分析研究  
C++
日歷
<2013年3月>
242526272812
3456789
10111213141516
17181920212223
24252627282930
31123456
統計
  • 隨筆 - 92
  • 文章 - 4
  • 評論 - 4
  • 引用 - 0

導航

常用鏈接

留言簿

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 

  資源管理(Managing Resources)始終是C++語言一個十分重要的話題,也是程序員在使用C++編寫代碼時需要十分注意的地方,稍有不慎就可能導致資源泄漏(resource leak),在筆者以往的編程實踐中就經常遇到此類問題。而“resource acquisition in initialization”是一種處理此類問題的較好方法,這是Stroustrup博士在演講中所提到的。關于這一點,在D&E [1] 以及相關論文 [2] 中也有所提及。該方法使用一個類來代表對資源的管理邏輯,將指向資源的句柄(指針或引用)通過構造函數傳遞給該類,在該類的實例被銷毀時由析構函數負責釋放資源??梢栽趧摻ㄔ擃惖膶嵗吧暾堎Y源,也可以在構造時由該類負責申請資源。這種方式的基本思路是,不論異常是否發生,由于C++的語言機制保證了,一定會調用位于當前范圍(scope)的對象的析構函數,所以只要在析構函數中加入資源回收的代碼,那么這些代碼總是會被執行的。這種方法的好處在于,由于將資源回收的邏輯通過單獨的類從原有代碼中剝離出來,使程序員總是不會遺漏,思路也變得清晰。

  以筆者之見,“resource acquisition in initialization”技法,在處理有關異常的問題時,其適用范圍還可以擴展。不單涉及資源管理,只要當scope里存在類似于fopen/fclose、new/delete這樣的對稱操作時,就可以酌情考慮采用這種方法。避免資源泄漏固然是頭等大事,應該列于基本保證(basic guarantee)之內。但某些對稱操作,如果會影響程序的正常執行甚至是產生致命錯誤(fatal error)的話,那么也是不可輕視的。而對于一個軟件而言,杜絕fatal error應該也算是一個basic guarantee www.yzyedu.com

  以下是筆者在實踐中遇到的一個例子。有意思的是,這個例子是本人在所負責的軟件模塊中首次決定使用異常處理機制所遇到的,可謂出師不利:)經過簡化后的代碼基本如下:

  void f(C *pObj)

  {

  pObj->Editable(true);

  // do some work with object

  pObj->Editable(false);

  }

  函數f的作用是對傳入其scope的pObj所指對象進行某些操作。當最初引入異常處理機制時,代碼改變如下:

  void f(C *pObj)

  {

  pObj->Editable(true);

  try {

  // do some work with object

  // may cause exception

  } catch(...)

  {

  // do some thing and rethrow

  throw;

  }

  pObj->Editable(false);

  }

  此處再度throw是為了使f的調用者能有機會做一些處理,這是在設計時所需要的。類似這樣的做法在一般的異常處理程序中是很常見的,但是筆者的疏忽卻另自己吃了大虧。雖然,從經過簡化的代碼中很容易看出破綻來,但是由于當時經驗不足,加之程序邏輯復雜,直到測試時通過最終的用戶界面才發現了問題。經過幾個小時的艱苦調試,最后發現問題出在f函數。事實上,函數f的行為隱含了一個斷言(assert),即:f保證不對pObj所指對象的不可編輯狀態做出更改,在調用f前對象是不可編輯的,調用后仍然如此。而在上述程序中,當異常發生時,由于沒有執行pObj->Editable(false)這一語句,所以導致程序最終出錯,而且這一錯誤隱蔽在無數代碼中,異常情況又并非每次都發生,使筆者在調試時定位錯誤花費了不少精力。

  在找到了錯誤根源之后,筆者采用了如下的補救措施,這一做法被Stroustrup博士稱為naive use:

  void f(C *pObj)

  {

  pObj->Editable(true);

  try {

  // do some work with object

  // may cause exception

  } catch(...)

  {

  // do some thing and rethrow

  pObj->Editable(false);

  throw; www.yzjxsp.com

  }

  pObj->Editable(false);

  }

  在寫下這段代碼的時候,直覺告訴自己,這里存在Bed Smell,但是由于時間緊迫,所以當時暫且容忍了這種Quick and Dirty的做法。正如Stroustrup博士在D&E中所指出的,

  這種做法的缺點是啰嗦,冗長乏味,而且可能代價昂貴。仔細分析一下,就可以看出這里存在的潛在危險:兩處pObj->Editable(false)事實上是重復代碼,我們需要始終保持兩處代碼的一致性,如果一段時間后,需要在pObj中增加一種類似Editable的屬性,這種一致性的保持,就需要延續,很難保證不會再次疏忽.

  于是,遵照大師的教誨,筆者增加了一個輔助類,代碼如下:

  class C_Handle {

  C* _pObj;

  public:

  C_Handle(C* pObj) {

  _pObj = pObj;

  _pObj->Editable(true);

  // may be other operations

  }

  ~C_Handle(){

  _pObj->Editable(false); www.jokedu.com

  // also may be operations according to ctor

  }

  operator C* () {return _pObj;}

  };

  C_Handle的構造函數和析構函數中,對_pObj所指對象的操作是成對出現的,所以在以后擴展時也不容易出錯。此時f函數的代碼也變得簡潔了許多 www.liuhebao.com

  void f(C* pObj)

  {

  C_Handle ch(pObj);

  try {

  // do some work with object

  // may cause exception

  } catch(...)

  {

  // do some thing and rethrow

  throw;

  }

  }

  個人覺得,這種技法應該具有普遍意義?,F總結如下:在某個scope內出現針對某個對象的若干對稱操作,而在彼此對稱的兩組操作間可能拋出異常以破壞這種對稱性,并且這種破壞將導致與該scope相關的某種斷言為假時,就可以考慮使用類似于Stroustrup博士在處理資源管理問題時所推薦的這種“resource acquisition in initialization”技法。甚至可以認為,資源管理中發生的例子是這里所提到的情形的一個特例。在資源管理方面的另一個很典型的例子是智能指針(Smart Pointer)[3]。 www.szfuao.com

  此外,對于這種方法可能存在的一個缺點是,或許會出現很多類似C_Handle這樣的規模很小的輔助類。對此我們可以這樣考慮:如果這些類不是很多,那么它們的存在將會給代碼的編寫和維護帶來好處(想想前面提到的維護一致性的代價),并且如果程序中多處出現這樣的類似情況時,這些類就可以復用了。而當類的數目多到讓你無法容忍時,就該考慮一下其中某些類存在的必要性了,畢竟并非程序的每處都要使用異常,也許你的設計本身存在問題。此外,如果這些輔助類彼此有關聯則可以考慮引入繼承體系,而如果它們之間的行為及其相似,使用模板機制(template)進行泛化,也不失為一個優化策略。

posted on 2011-07-25 23:09 HAOSOLA 閱讀(180) 評論(0)  編輯 收藏 引用
 
Copyright © HAOSOLA Powered by: 博客園 模板提供:滬江博客
PK10開獎 PK10開獎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜精品福利在线| 国产区日韩欧美| 日韩一二三区视频| 亚洲人在线视频| 亚洲国产一区二区三区a毛片| 久久综合亚洲社区| 毛片av中文字幕一区二区| 久久午夜视频| 欧美成人激情视频| 亚洲精品国精品久久99热一| 夜夜嗨av一区二区三区免费区| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲精选中文字幕| 亚洲精品国产精品乱码不99| 夜夜嗨av色一区二区不卡| 亚洲在线免费视频| 久久婷婷国产综合尤物精品| 亚洲国产精品视频一区| 亚洲午夜视频| 免费的成人av| 国产精品日韩在线观看| 在线观看一区二区视频| 一本色道久久综合狠狠躁的推荐| 亚洲综合视频网| 欧美国产综合视频| 亚洲一区自拍| 欧美久久视频| 国内不卡一区二区三区| 亚洲欧洲精品一区二区三区不卡 | 亚洲精品久久久久久下一站| 亚洲影视九九影院在线观看| 久久综合国产精品| 欧美ed2k| 国产精品成人免费视频| 狠狠色香婷婷久久亚洲精品| 一区电影在线观看| 欧美成人有码| 欧美一区二视频| 国产精品电影在线观看| 91久久久久久| 免费成人性网站| 欧美一级片一区| 欧美连裤袜在线视频| 在线观看亚洲| 久久精品水蜜桃av综合天堂| 野花国产精品入口| 欧美电影资源| 亚洲国产精品ⅴa在线观看| 欧美在线三区| 亚洲欧美另类在线| 国产精品乱人伦一区二区| 日韩午夜激情av| 亚洲第一黄色网| 欧美96在线丨欧| **欧美日韩vr在线| 麻豆精品精品国产自在97香蕉| 亚洲欧美一区二区视频| 国产精品亚发布| 欧美一区二区视频在线| 亚洲女同在线| 国产亚洲一二三区| 久久久91精品国产| 久久精品国产一区二区电影| 国产欧美综合一区二区三区| 新67194成人永久网站| 亚洲一区黄色| 国产午夜精品一区二区三区欧美 | 欧美片在线观看| 亚洲精品在线三区| 亚洲国内精品在线| 欧美日韩精品一区二区在线播放| av不卡在线观看| 99国产精品久久| 国产精品国产成人国产三级| 亚洲尤物在线视频观看| 亚洲综合99| 伊人成年综合电影网| 欧美成人一区二区三区片免费| 欧美不卡一区| 午夜精品国产| 久久精品99国产精品日本| 亚洲福利视频一区| 日韩亚洲视频| 国产日本欧美一区二区| 噜噜噜躁狠狠躁狠狠精品视频| 牛牛精品成人免费视频| 亚洲深夜影院| 久久精品一区二区三区不卡| 亚洲高清精品中出| 亚洲视频免费在线观看| 欧美一区二区三区在线观看 | 激情综合色综合久久| 亚洲国产精品尤物yw在线观看| 欧美日韩久久| 久久久精品一区| 欧美精品一区二区在线播放| 欧美在线观看日本一区| 免费看成人av| 欧美伊人久久久久久久久影院| 麻豆久久婷婷| 久久国产99| 欧美日韩视频专区在线播放| 久久亚洲精品欧美| 国产精品爱久久久久久久| 美女91精品| 国产精品自拍小视频| 欧美国产日本高清在线| 国产精品影视天天线| 最新国产成人在线观看| 国产一区二区视频在线观看| 日韩视频一区二区三区在线播放免费观看 | 麻豆精品视频在线| 国产精品久久久久久福利一牛影视| 久久婷婷成人综合色| 国产精品高精视频免费| 欧美国产高清| 黄色成人精品网站| 亚洲欧美在线免费| 日韩一区二区精品葵司在线| 久久精品国产第一区二区三区| 亚洲一区二区三区视频| 欧美国产一区二区在线观看| 久久亚洲影音av资源网| 国产精品综合色区在线观看| 亚洲免费观看高清完整版在线观看熊 | 亚洲一区二三| 亚洲深夜福利视频| 欧美理论电影在线播放| 亚洲狠狠婷婷| 亚洲国产日韩欧美在线动漫| 久久riav二区三区| 久久久久一区二区三区四区| 国产精品中文字幕在线观看| 一区二区三区国产在线观看| 亚洲少妇最新在线视频| 欧美精品激情在线观看| 欧美国产日韩在线| 在线播放不卡| 久久婷婷丁香| 男女精品视频| 亚洲电影有码| 久久一二三区| 免费视频最近日韩| 伊人久久av导航| 久久精品亚洲精品国产欧美kt∨| 欧美综合国产精品久久丁香| av成人手机在线| 一本色道久久综合亚洲91| 欧美成人精品影院| 欧美激情第一页xxx| 亚洲大黄网站| 欧美久久久久久久久久| 亚洲精品综合精品自拍| 亚洲最新合集| 国产精品久久久久久久久免费桃花| 一本色道久久综合亚洲91| 亚洲一区区二区| 国产综合久久久久久鬼色| 久久久久久成人| 欧美国产91| 亚洲午夜精品一区二区| 欧美午夜视频网站| 亚洲欧美成人一区二区在线电影| 欧美一级理论性理论a| 国产日韩精品入口| 久久免费精品日本久久中文字幕| 欧美激情亚洲一区| 亚洲一区在线免费观看| 国产精品综合av一区二区国产馆| 久久久www免费人成黑人精品 | 欧美激情第10页| 一区二区三区日韩欧美| 国产精品一区二区久激情瑜伽| 久久久久久国产精品一区| 欧美国产日韩二区| 亚洲欧美激情精品一区二区| 韩国三级电影久久久久久| 欧美成人有码| 亚洲午夜视频在线| 亚洲高清二区| 欧美中文在线视频| 最近中文字幕日韩精品| 国产精品免费一区二区三区观看 | 欧美体内谢she精2性欧美| 久久国产精彩视频| 一区二区免费在线视频| 美女91精品| 午夜一区二区三区在线观看| 亚洲激情第一区| 国产喷白浆一区二区三区| 欧美激情精品久久久久久久变态| 午夜在线一区| 亚洲精品国精品久久99热一| 国产精品一区二区久久久久 | 国产午夜精品美女毛片视频| 欧美日韩国产91| 久久综合给合久久狠狠狠97色69| 亚洲欧美国产制服动漫| 亚洲日本中文字幕免费在线不卡| 久久久久久久久久久久久女国产乱|