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

alex

alex

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  7 隨筆 :: 6 文章 :: 7 評(píng)論 :: 0 Trackbacks

今天來講講怎么編寫異常安全的代碼。
程序運(yùn)行過程中,往往需要對(duì)一些流程加入異常處理,來提高程序的robust.比如
通過try catch來捕捉異常
try
{
??? pMemory = new char[MAX_BUF_SIZE];
}
catch(std::bad_alloc& e)
{
??? //error handling,er:do something resource free
}
但在程序代碼段中出現(xiàn)大量的try catch,不僅從美觀,效率和程序輸寫上都是不怎么好。
而另外一種對(duì)于異常的處理方法是依賴于c++的ctor/dctor的匹配來做的,就是所謂的
RAII,這個(gè)很容易讓人聯(lián)想到std::auto_ptr
std::auto_ptr<int> tmp(new int);
通過new分配的對(duì)象會(huì)在tmp生命結(jié)束后,釋放相關(guān)的資源,通過這種方式,就能保證在程序異常,或退出時(shí),已分配的對(duì)象能正確自動(dòng)的釋放擁有的資源,而在對(duì)象聲明周期內(nèi),可以保證資源的有效性。
這種方式就是今天blog要寫的主要內(nèi)容,我們可以看到std::auto_ptr作用范圍很小,只能對(duì)從堆上分配的對(duì)象進(jìn)行管理,假如對(duì)文件打開句柄實(shí)行RAII,你也許會(huì)認(rèn)為再寫個(gè)不就是了,但這樣只會(huì)造成源代碼里充滿了這些資源管理的類,這導(dǎo)致了一個(gè)嚴(yán)重的問題,好的結(jié)構(gòu)在繁瑣的流暢前面變的難堪。
那怎么樣對(duì)這個(gè)進(jìn)行泛化,從而能對(duì)比如從簡單的指針釋放,文件句柄維護(hù),甚至相關(guān)的成員函數(shù)。我們來看下loki::socpeguard是怎么實(shí)現(xiàn)的:
先看下基本的用法
(1)? FILE* hFileOpen = fopen(....);
(2)? LOKI_ON_BLOCK_EXIT(flose,hFileOpen);
line2會(huì)在出LOKI_ON_BLOCK_EXIT域或程序異常結(jié)束時(shí)被調(diào)用,下面是對(duì)類成員的調(diào)用
void CTestObject::Create
{
??? LOKI_ON_BLOCK_EXIT_OBJ(*this,FressResouce);
??? ...
}
同上面差不多,會(huì)在這個(gè)函數(shù)結(jié)束后或異常結(jié)束后調(diào)用類成員的FreeResource.在正常流程結(jié)束后,可以通過調(diào)用Dismiss來防止對(duì)FreeResouce的調(diào)用,即類似數(shù)據(jù)庫操作的commit操作。下面來分析下LOKI的實(shí)現(xiàn):
從上面可以看到,RAII的是:
1:構(gòu)造函數(shù)對(duì)資源的獲取
2:稀構(gòu)函數(shù)對(duì)資源的釋放
先來看下LoKi對(duì)上面那2個(gè)宏的定義
#define LOKI_ON_BLOCK_EXIT????? Loki::ScopeGuard LOKI_ANONYMOUS_VARIABLE(scopeGuard) = Loki::MakeGuard

#define LOKI_ON_BLOCK_EXIT_OBJ? Loki::ScopeGuard LOKI_ANONYMOUS_VARIABLE(scopeGuard) = Loki::MakeObjGuard
上面的Loki::ScopeGuard是一個(gè)基類的別名
typedef const ScopeGuardImplBase& ScopeGuard;
而LOKI_ANONYMOUS_VARIABLE(scopeGuard)用來我們產(chǎn)生唯一的名字,有時(shí)假如需要調(diào)用Dismiss的話,則需要自己去實(shí)現(xiàn)宏定義的內(nèi)容,這樣才能通過對(duì)象訪問。Loki::MakeGuard或Loki::MakeObjGuard是用來產(chǎn)生對(duì)象的實(shí)際類型的,下面是一個(gè)
Loki::MakeGuard的例子:
template <typename F, typename P1>
inline ScopeGuardImpl1<F, P1> MakeGuard(F fun, P1 p1)
{
??? return ScopeGuardImpl1<F, P1>::MakeGuard(fun, p1);
}
可以看到ScopeGuardImpl1<F, P1>是要產(chǎn)生的具體類型,MakeGuard通過函數(shù)參數(shù)的數(shù)目來重載的,而MakeGuard此處的作用是要睡死了...-_-'',作用是利用函數(shù)自動(dòng)推導(dǎo)出參數(shù)的類型,這樣就免去了指定ScopeGuardImpl1的類型的麻煩,而
ScopeGuardImpl1<F, P1>::MakeGuard(fun, p1);
簡單的返回對(duì)象的一個(gè)臨時(shí)變量,并assign給一個(gè)上面的一個(gè)scopeguard的實(shí)例,這里依賴一個(gè)C++的特性,臨時(shí)變量的聲命周期和通過他初始化的引用類型的聲明周期是一致的。

從上面可以看到Loki定義了一個(gè)ScopeGuardImplBase的基礎(chǔ)類。這個(gè)類定義了一個(gè)基本的方法Dismiss,以及相關(guān)的狀態(tài)。下面是loki中這個(gè)類的定義
class ScopeGuardImplBase
{
??? ScopeGuardImplBase& operator =(const ScopeGuardImplBase&);
?protected:
??? ~ScopeGuardImplBase()
??? {}
??? ScopeGuardImplBase(const ScopeGuardImplBase& other) throw()
??????? : dismissed_(other.dismissed_)
??? {
??????? other.Dismiss();
??? }
??? template <typename J>
??? static void SafeExecute(J& j) throw()
??? {
??????? if (!j.dismissed_)
?????????? try
?????????? {
????????????? j.Execute();
?????????? }
?????????? catch(...)
?????????? {}
???? }
???????
???? mutable bool dismissed_;
public:
???? ScopeGuardImplBase() throw() : dismissed_(false)
???? {}
???? void Dismiss() const throw()
???? {
???????? dismissed_ = true;
????? }
};
可以看到類里面定義了上面所說的一些屬性,其中SafeExecute用來提供子類同一的資源釋放方法,并調(diào)用子類的方法來具體操作,因?yàn)橄嚓P(guān)的函數(shù),變量都保存在具體的子類,可以看到這個(gè)函數(shù)使用了try catch,這里加這個(gè)的目的是,因?yàn)橘Y源釋放要在子類的稀構(gòu)里被觸發(fā),而調(diào)用具體的方法是外面?zhèn)鬟M(jìn)來的,所以無法保證一定是異常安全的,而假如在稀構(gòu)里面異常的話,會(huì)導(dǎo)致程序的行為無法定義。
下面具體來看下一個(gè)子類的實(shí)現(xiàn):
template <typename F, typename P1>
class ScopeGuardImpl1 : public ScopeGuardImplBase
{
public:
??? static ScopeGuardImpl1<F, P1> MakeGuard(F fun, P1 p1)
??? {
??????? return ScopeGuardImpl1<F, P1>(fun, p1);
??? }
??? ~ScopeGuardImpl1() throw()
??? {
??????? SafeExecute(*this);
??? }
??? void Execute()
??? {
??????? fun_(p1_);
??? }
protected:
??? ScopeGuardImpl1(F fun, P1 p1) : fun_(fun), p1_(p1)
??? {}
??? F fun_;
??? const P1 p1_;
};
在LoKi里面可以看到很多類似ScopeGuardImpl1的定義,比如ScopeGuardImpl0,
ScopeGuardImpl2,可以發(fā)現(xiàn)最后面的數(shù)字表示具體參數(shù)的數(shù)目。
可以看到上面所說的MakeGuard的定義,以及對(duì)基類方法的調(diào)用,可以看到構(gòu)造函數(shù)接收的類型,一個(gè)函數(shù)對(duì)象,和一些參數(shù)對(duì)象,并保存,對(duì)于成員函數(shù)的scopeguard,LoKi定義了1些相似的類,主要是增加了對(duì)象的引用,還有就是函數(shù)的調(diào)用方式上。
上面可以看到參數(shù)是通過值的方式來保存的而不是通過引用。而且是const屬性的,下面是相關(guān)的分析。
1:通過傳值的方式,從而避免了異常拋出時(shí),可能引用的對(duì)象被稀構(gòu)
2:加const屬性,從而保證了在func需要參數(shù)是reference時(shí)而保存的參數(shù)確是非const時(shí)產(chǎn)生相應(yīng)的編譯錯(cuò)誤,因?yàn)閷?duì)reference傳人const non-reference形式是錯(cuò)誤的。
而對(duì)于1的方式,存在的一種問題是假如操作的fun需要傳入引用,那傳進(jìn)去的值就無法在釋放的函數(shù)中被改變,而2是對(duì)這種的一種類似契約似的編程,Loki 提供的方法是通過一個(gè)中間對(duì)象來保存操作參數(shù)的引用,并賦予這個(gè)對(duì)象自動(dòng)轉(zhuǎn)換功能。下面是這個(gè)類的定義:
template <class T>
class RefToValue
{??
public:
??? RefToValue(T& ref) : ref_(ref)
??? {}
??? RefToValue(const RefToValue& rhs) : ref_(rhs.ref_)
??? {}
??? operator T& () const
??? {
??????? return ref_;
??? }
private:
??? // Disable - not implemented
??? RefToValue();
??? RefToValue& operator=(const RefToValue&);
???????
??? T& ref_;
};
可以很清楚的看到類的實(shí)現(xiàn),下面是一個(gè)工具類
template <class T>
inline RefToValue<T> ByRef(T& t)
{
???? return RefToValue<T>(t);
}
下面給個(gè)具體的例子,假如
template<typename _Ty>
void SAFEDELETE(_Ty*& ptr)
{
?? if (NULL != ptr)
????? delete ptr;
?? ptr = NULL;
}

char* ptr = new char;
?
{
??? LOKI_ON_BLOCK_EXIT(SAFEDELETE<char>,Loki::ByRef(ptr));
}
?
if (NULL == ptr)
? std::cout << "NULL" << std::endl;
基本上就這么多了,sleep去了
??????????????????????????????????????????????????? alex_yuu

posted on 2007-02-11 15:55 agerlis 閱讀(1409) 評(píng)論(3)  編輯 收藏 引用

評(píng)論

# re: 編寫異常安全的代碼(loki::scopeguard) 2007-02-11 15:56 agerlis
請(qǐng)問,怎么設(shè)置背景色?  回復(fù)  更多評(píng)論
  

# re: 編寫異常安全的代碼(loki::scopeguard) 2007-02-12 16:13 mc
不錯(cuò),把Loki::ScopeGuard介紹的比較透徹了:)  回復(fù)  更多評(píng)論
  

# re: 編寫異常安全的代碼(loki::scopeguard) 2007-05-28 16:40 candy
看到這些代碼我就暈了,厲害啊,我比較討厭編程。。嘿嘿,我是龔芳萍。  回復(fù)  更多評(píng)論
  


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品v片在线观看不卡| 久久久久免费观看| 国产精品国产馆在线真实露脸| 久久影视精品| 久久久久久久久蜜桃| 老色鬼久久亚洲一区二区| 久久米奇亚洲| 欧美精品一区二区三区蜜桃| 免费成人网www| 国产精品高潮久久| 国产一区二区三区精品久久久| 国产精品综合视频| 91久久精品一区二区三区| 亚洲综合精品自拍| 一区二区久久久久久| 一二美女精品欧洲| 久久久国产精彩视频美女艺术照福利 | 亚洲国产精品久久久久秋霞不卡| 亚洲在线观看视频网站| 亚洲一区二区三区激情| 欧美激情四色 | 国产日韩一区在线| 91久久线看在观草草青青| 午夜一级在线看亚洲| 欧美一区二区免费观在线| 午夜激情亚洲| 日韩一二三区视频| 欧美精品色综合| 亚洲免费观看高清完整版在线观看| 欧美诱惑福利视频| 一本大道久久精品懂色aⅴ| 欧美日本亚洲| 99精品久久久| 欧美午夜宅男影院| 亚洲欧美国产高清va在线播| 夜夜嗨网站十八久久| 欧美肥婆bbw| 久久视频精品在线| 亚洲国产成人久久| 久久久精品国产免费观看同学| 99国内精品久久| 国产精品白丝黑袜喷水久久久 | 欧美黄色片免费观看| 亚洲无线一线二线三线区别av| 亚洲大片精品永久免费| 欧美精品 日韩| 欧美亚洲网站| 欧美伊人久久久久久午夜久久久久| 国产精品中文在线| 免费中文日韩| 亚洲精品字幕| 久久综合综合久久综合| 亚洲精品一级| 久久精品夜夜夜夜久久| 亚洲精品一级| 亚洲欧美一区二区三区在线| 亚洲伦理精品| 欧美一级午夜免费电影| 亚洲免费综合| 农夫在线精品视频免费观看| 久久青草欧美一区二区三区| 鲁大师成人一区二区三区| 你懂的国产精品永久在线| 欧美激情一区二区三区 | 亚洲黄色高清| 亚洲午夜小视频| 亚洲免费视频网站| 亚洲成色777777在线观看影院| 免费日韩成人| 国产在线拍揄自揄视频不卡99| 久久在线观看视频| 国产欧美欧美| 午夜精品久久久久久久99水蜜桃| 亚洲国产成人91精品| 欧美一区国产一区| 国产亚洲a∨片在线观看| 亚洲影视在线| 欧美在线免费| 亚洲伦理在线| 国产精品香蕉在线观看| 国产精品99久久久久久久女警| 亚洲黄色片网站| 美女任你摸久久| 久久久久天天天天| 免费视频一区二区三区在线观看| 国产一区清纯| 午夜精品视频在线观看| 欧美不卡激情三级在线观看| 亚洲伦理精品| 国产精品美女999| 一区二区三区黄色| 亚洲一区精品视频| 国产精品成人观看视频免费| 午夜精品久久久久久久久久久久| 欧美中文字幕在线| 一区二区三区产品免费精品久久75| 国产精品毛片在线| 一本色道久久| 国产欧美视频一区二区三区| 久久综合综合久久综合| 亚洲精品久久| 蜜桃av久久久亚洲精品| 午夜精品久久久久久久男人的天堂| 国产日韩精品视频一区| 免费欧美在线视频| 香蕉成人久久| 亚洲黄一区二区三区| 久久精品国产一区二区三区免费看 | 亚洲啪啪91| 国产区精品视频| 欧美视频三区在线播放| 免费不卡在线观看av| 亚洲欧美日韩国产成人精品影院 | 91久久久精品| 亚洲国产日韩欧美| 国产一区二区三区成人欧美日韩在线观看| 久久久7777| 久久嫩草精品久久久精品| 欧美国产另类| 欧美成人小视频| 亚洲福利国产| 亚洲精品看片| 亚洲视频电影图片偷拍一区| 亚洲国产精品精华液2区45| 美国成人直播| 亚洲人永久免费| 日韩视频国产视频| 欧美一区二区大片| 亚洲毛片在线看| 一区二区动漫| 久久综合精品国产一区二区三区| 久久久www| 欧美成人免费在线观看| 欧美国产成人精品| 一本久久a久久免费精品不卡| 亚洲欧美久久久久一区二区三区| 欧美一区二区免费| 欧美片在线观看| 国产深夜精品| 一区二区三区国产精品| 欧美一区二区三区四区在线观看| 亚洲第一色在线| 久久xxxx| 加勒比av一区二区| 久久亚洲综合色| 一区二区三区日韩欧美| 欧美日韩国产综合视频在线| 国产日韩欧美在线视频观看| 欧美另类在线观看| 黄色日韩网站视频| 久久精品国产第一区二区三区最新章节 | 欧美日韩在线观看视频| 亚洲大片在线观看| 玖玖在线精品| 欧美刺激午夜性久久久久久久| 亚洲视频一区在线观看| 久久久久天天天天| 国产一区二区看久久| 在线成人免费观看| 亚洲男人第一av网站| 久久综合福利| 欧美丰满少妇xxxbbb| 国产精品久久久久一区| 蜜桃久久精品乱码一区二区| 欧美日韩在线看| 久久中文字幕导航| 国产精品丝袜91| 亚洲国产精品国自产拍av秋霞| 国产精品久久久久久久一区探花 | 亚洲激情女人| 亚洲一级黄色| 亚洲校园激情| 欧美巨乳在线| 欧美激情视频在线播放| 国产日韩在线视频| 亚洲欧美日韩网| 久久亚洲捆绑美女| 亚洲黄网站黄| 免费欧美视频| 在线亚洲自拍| 久久久午夜视频| 99精品热视频| 午夜精品国产更新| 亚洲天堂免费在线观看视频| 狼狼综合久久久久综合网| 久久激情综合网| 国产精品女人毛片| 亚洲一区二区不卡免费| 亚洲一区免费网站| 国产精品毛片大码女人| 亚洲伊人网站| 久久综合激情| 亚洲裸体视频| 欧美日韩国产精品自在自线| 欧美亚洲成人网| 亚洲国产精品小视频| 久久久久久久尹人综合网亚洲| 久久这里只有| 亚洲看片网站| 欧美午夜视频|