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

C++分析研究  
C++
日歷
<2013年10月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789
統計
  • 隨筆 - 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>
            亚洲精品在线免费观看视频| 日韩视频永久免费观看| 午夜精品久久久久影视 | 亚洲性视频网站| 欧美性淫爽ww久久久久无| 亚洲一区二区三区免费在线观看 | 亚洲自拍高清| 国产日韩欧美综合一区| 麻豆精品传媒视频| 欧美风情在线观看| 亚洲欧美在线高清| 久久精品二区| 日韩小视频在线观看专区| 亚洲香蕉伊综合在人在线视看| 国产精品实拍| 免费在线视频一区| 欧美天天视频| 麻豆国产va免费精品高清在线| 蜜桃久久av一区| 亚洲欧美日韩成人| 久久久久国产精品一区三寸 | 国产精品成人一区二区艾草| 久久国产高清| 欧美精品首页| 久久伊人免费视频| 欧美午夜精品久久久久久超碰| 久久久蜜臀国产一区二区| 欧美成人乱码一区二区三区| 午夜精品久久久久久久久久久| 欧美自拍偷拍午夜视频| 日韩亚洲欧美高清| 欧美在线视频一区二区| 99pao成人国产永久免费视频| 亚洲一区久久| 99国产精品久久久久久久成人热| 亚洲影院在线观看| 99一区二区| 久久夜色精品国产噜噜av| 午夜精品区一区二区三| 欧美电影免费观看| 久久午夜色播影院免费高清| 欧美三级小说| 亚洲国产精品久久久久秋霞不卡 | 一区二区三区 在线观看视| 欧美综合77777色婷婷| 亚洲一级特黄| 你懂的视频一区二区| 久久中文欧美| 国产欧美综合一区二区三区| 亚洲美女在线视频| 亚洲剧情一区二区| 久久天天狠狠| 久久亚洲一区二区三区四区| 国产精品视频yy9299一区| 亚洲免费久久| 一本色道久久88综合亚洲精品ⅰ | 欧美尤物巨大精品爽| 午夜精品美女自拍福到在线 | 欧美xxx成人| 蜜桃久久av| 国内成+人亚洲| 午夜精品久久久久影视 | 亚洲永久精品大片| 欧美日韩亚洲一区二区三区在线观看| 欧美二区乱c少妇| 尤物在线精品| 免费视频一区| 亚洲国产精品第一区二区三区| 在线观看日韩精品| 老色批av在线精品| 欧美激情va永久在线播放| 亚洲高清电影| 欧美成人性网| 99在线精品视频| 亚洲欧美在线观看| 国产亚洲综合精品| 久久九九热免费视频| 欧美成年人在线观看| 亚洲黄色av| 欧美日韩第一区日日骚| 一区二区三区成人| 午夜精品久久久久久久| 国产情人节一区| 久久精彩免费视频| 亚洲第一中文字幕| 99国产精品久久久久老师| 欧美日韩在线播放三区四区| 亚洲婷婷在线| 久久久伊人欧美| 亚洲日本电影在线| 欧美午夜精品伦理| 久久久国产成人精品| 亚洲国产精品va在线观看黑人 | 狠狠入ady亚洲精品| 久久中文字幕一区二区三区| 亚洲三级免费电影| 欧美在线观看视频一区二区三区| 国产亚洲一本大道中文在线| 欧美www在线| 亚洲午夜91| 欧美高清视频在线播放| 亚洲一区二区三区涩| 国外成人性视频| 欧美激情综合色| 香蕉久久夜色| 国产精品久久久久久久一区探花 | 亚洲激情一区二区| 午夜视频一区| 亚洲九九爱视频| 国产视频在线观看一区| 欧美高清视频www夜色资源网| 亚洲影院免费观看| 亚洲国产99| 久久亚洲私人国产精品va| 亚洲天堂av在线免费观看| 激情久久久久久久久久久久久久久久 | 亚洲小视频在线| 狠狠色丁香久久婷婷综合丁香| 欧美日韩成人综合| 久久综合伊人77777| 性久久久久久| 一区二区久久久久久| 欧美va亚洲va国产综合| 久久xxxx| 午夜精品久久久久99热蜜桃导演| 亚洲精品久久在线| 1000部国产精品成人观看| 国产日韩欧美精品综合| 国产精品wwwwww| 欧美日产在线观看| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美亚洲免费电影| 亚洲图片在区色| 99精品久久| 99国产精品国产精品久久| 亚洲国产精品一区二区第一页| 久久午夜av| 久久久五月天| 久久久青草婷婷精品综合日韩 | 影音先锋久久精品| 国内成+人亚洲| 国内一区二区三区在线视频| 国产精品一区二区久久精品| 国产精品久久97| 国产精品美女久久久久aⅴ国产馆| 欧美另类变人与禽xxxxx| 免费不卡中文字幕视频| 久久综合99re88久久爱| 久久综合中文字幕| 欧美福利专区| 欧美日本韩国一区| 欧美午夜激情视频| 国产精品免费小视频| 国产视频欧美| 伊人婷婷久久| 亚洲精品视频在线看| 亚洲少妇中出一区| 亚洲欧美日本日韩| 久久久久久伊人| 欧美va亚洲va香蕉在线| 亚洲人成小说网站色在线| 日韩视频专区| 香蕉视频成人在线观看| 久久夜色精品国产欧美乱| 欧美国产日韩一区二区三区| 欧美经典一区二区三区| 欧美私人啪啪vps| 韩国在线视频一区| 亚洲人体1000| 亚洲欧美成aⅴ人在线观看| 久久九九免费| 最新日韩av| 香蕉久久一区二区不卡无毒影院| 久久综合99re88久久爱| 欧美日韩国产小视频| 国产一区二区三区四区老人| 亚洲国产天堂久久综合| 亚洲一区二区三区精品在线观看| 久久精品最新地址| 91久久精品国产91久久| 亚洲欧美网站| 欧美大片国产精品| 国产精品永久免费在线| 亚洲精品无人区| 久久久夜色精品亚洲| 日韩一级黄色av| 猫咪成人在线观看| 国产精品尤物| 9国产精品视频| 男人的天堂亚洲在线| 亚洲综合日韩| 欧美视频不卡| 亚洲国产精品va在线观看黑人| 性欧美1819sex性高清| 亚洲高清久久久| 久久精品国产成人| 国产精品视频一区二区高潮| 亚洲精品一区二区三区99| 六月天综合网| 欧美亚洲综合久久|