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

C++分析研究  
C++
日歷
<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
統計
  • 隨筆 - 92
  • 文章 - 4
  • 評論 - 4
  • 引用 - 0

導航

常用鏈接

留言簿

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 

  資源管理(Managing Resources)始終是C++語言一個十分重要的話題,也是程序員在使用C++編寫代碼時需要十分注意的地方,稍有不慎就可能導致資源泄漏(resource leak),在筆者以往的編程實踐中就經常遇到此類問題。而“resource acquisition in initialization”是一種處理此類問題的較好方法,這是Stroustrup博士在演講中所提到的。關于這一點,在D&E [1] 以及相關論文 [2] 中也有所提及。該方法使用一個類來代表對資源的管理邏輯,將指向資源的句柄(指針或引用)通過構造函數傳遞給該類,在該類的實例被銷毀時由析構函數負責釋放資源。可以在創建該類的實例之前申請資源,也可以在構造時由該類負責申請資源。這種方式的基本思路是,不論異常是否發生,由于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;

  }

  }

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

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

posted on 2011-07-25 23:09 HAOSOLA 閱讀(191) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


 
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>
            亚洲三级色网| 亚洲欧美日韩精品一区二区| 午夜精彩视频在线观看不卡| 亚洲成人在线视频网站| 欧美日韩在线免费观看| 1024精品一区二区三区| 欧美成人午夜免费视在线看片| 午夜精品久久久久久久白皮肤| 国产精品爽黄69| 久久另类ts人妖一区二区| 欧美在线播放一区| 黄色成人在线观看| 亚洲激情六月丁香| 国产精品亚洲综合| 美女国内精品自产拍在线播放| 免费观看日韩av| 性视频1819p久久| 欧美国产先锋| 久久一二三国产| 国产精品久久久久久久久免费樱桃 | 欧美一区二区三区喷汁尤物| 国产亚洲一区二区三区| 最近看过的日韩成人| 国产精品资源在线观看| 亚洲精品一二区| 91久久精品一区二区三区| 亚洲一线二线三线久久久| 91久久精品美女高潮| 久久爱91午夜羞羞| 亚洲影院免费观看| 欧美区在线播放| 欧美成人一区二区三区片免费| 国产欧美日韩激情| 亚洲图片自拍偷拍| 亚洲一区二区三区免费视频| 欧美日韩成人综合在线一区二区 | 亚洲综合不卡| 久久精品99国产精品| 国产精品丝袜白浆摸在线| 亚洲美女视频在线观看| 亚洲国产精品久久人人爱蜜臀| 性欧美大战久久久久久久免费观看 | 狠狠色2019综合网| 午夜精品国产更新| 久久美女性网| 亚洲人屁股眼子交8| 女生裸体视频一区二区三区| 亚洲国产你懂的| 99国产麻豆精品| 欧美三级电影网| 性欧美超级视频| 亚洲国产日韩综合一区| 亚洲综合国产激情另类一区| 国产欧美亚洲一区| 欧美二区不卡| 欧美主播一区二区三区美女 久久精品人 | 欧美成人在线网站| 亚洲免费一区二区| 亚洲第一精品影视| 午夜国产欧美理论在线播放| 尤物精品在线| 欧美日韩蜜桃| 久久香蕉国产线看观看av| 99国产欧美久久久精品| 欧美成人精品不卡视频在线观看| 亚洲自拍三区| 亚洲一区免费| 亚洲丝袜av一区| 正在播放日韩| 日韩亚洲精品在线| 欧美系列亚洲系列| 久久中文字幕一区| 99国内精品| 1769国内精品视频在线播放| 国产精品色婷婷| 国产精品永久在线| 国产午夜精品福利| 国产亚洲一区二区三区在线播放 | 欧美日韩伊人| 欧美性大战久久久久久久蜜臀 | 日韩午夜激情av| 99在线观看免费视频精品观看| 亚洲国产你懂的| 亚洲天堂av在线免费| 一区二区三区四区五区视频| 亚洲天堂av在线免费| 午夜亚洲福利| 欧美韩日一区二区| 欧美亚洲成人网| 91久久国产综合久久| 一区二区av在线| 久久久国产一区二区三区| 欧美 日韩 国产一区二区在线视频| 久热精品在线视频| 亚洲理伦在线| 久久精品一本久久99精品| 欧美日韩精品久久| 国内外成人在线视频| 日韩视频在线免费| 女女同性女同一区二区三区91| 亚洲肉体裸体xxxx137| 久久精品夜色噜噜亚洲a∨| 欧美日韩欧美一区二区| 亚洲高清视频在线观看| 欧美一级视频一区二区| 日韩天堂在线观看| 欧美成年人在线观看| 国产亚洲免费的视频看| 亚洲天堂av高清| 一本色道**综合亚洲精品蜜桃冫| 麻豆91精品91久久久的内涵| 国产精品国产三级国产aⅴ入口 | 国产一区二区电影在线观看| 亚洲精品乱码久久久久久| 老司机午夜免费精品视频| 性高湖久久久久久久久| 国产精品自在线| 欧美一区二区三区视频| 亚洲欧美国产毛片在线| 国产欧美日韩一区二区三区在线观看| 亚洲理伦电影| 一区二区三区视频在线观看| 欧美日韩亚洲视频一区| 亚洲一区二区三区777| 亚洲视频免费在线观看| 国产一区二区精品久久99| 久久香蕉国产线看观看av| 欧美va亚洲va国产综合| 亚洲图片欧美一区| 久久久夜色精品亚洲| 99re热精品| 久久激情五月激情| 国产乱码精品一区二区三| 日韩视频中文字幕| 亚洲少妇自拍| 亚洲第一天堂无码专区| 亚洲一二三区在线| 亚洲国产一区二区三区在线播| 夜夜嗨av一区二区三区网页| 国产亚洲欧美一区二区| 91久久综合| 尤物99国产成人精品视频| 亚洲精品婷婷| 亚洲乱码视频| 久久精品99| 午夜精品视频在线| 欧美日韩免费一区二区三区| 欧美激情免费观看| 一色屋精品视频在线观看网站| 亚洲综合欧美日韩| 亚洲女ⅴideoshd黑人| 欧美日韩精品在线| 亚洲国产精品视频| 亚洲欧洲一级| 欧美精品久久99久久在免费线| 欧美v日韩v国产v| 亚洲看片网站| 国产精品亚洲а∨天堂免在线| 一区二区电影免费在线观看| 亚洲一级黄色片| 国产一区二区三区奇米久涩| 久久精品国产一区二区电影| 久久综合久久综合这里只有精品| 国产午夜精品一区二区三区欧美| 国产精品99久久久久久www| 久久不见久久见免费视频1| 狠狠色狠狠色综合系列| 每日更新成人在线视频| 欧美激情亚洲精品| 亚洲夜间福利| 国精品一区二区| 欧美男人的天堂| 欧美有码视频| 制服丝袜激情欧洲亚洲| 欧美在线视频a| 亚洲电影免费观看高清| 欧美日本韩国| 免费在线亚洲| 性色av一区二区三区| 亚洲精品久久久久久久久久久| 亚洲欧美国产制服动漫| 亚洲国产欧美一区二区三区久久 | 亚洲国产高清aⅴ视频| 国产精品一区二区久久久久| 欧美成年人网站| 久久久久久久久蜜桃| 午夜一区在线| 亚洲欧美国产日韩天堂区| 日韩视频在线一区二区| 欧美黄色一级视频| 久久一二三四| 欧美高清视频一区| 玖玖精品视频| 你懂的视频欧美| 欧美国产日韩一区二区| 欧美激情一区二区三区全黄| 欧美电影打屁股sp| 亚洲欧洲一区二区三区在线观看| 亚洲激情啪啪| 亚洲免费视频成人|