亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C++中禁止異常信息傳遞到析構函數外

2019-11-17 05:38:51
字體:
來源:轉載
供稿:網友

  在有兩種情況下會調用析構函數。第一種是在正常情況下刪除一個對象,例如對象超出了作用域或被顯式地delete。第二種是異常傳遞的堆棧輾轉開解(stack-unwinding)過程中,由異常處理系統刪除一個對象。

  在上述兩種情況下,調用析構函數時異常可能處于激活狀態也可能沒有處于激活狀態。遺憾的是沒有辦法在析構函數內部區分出這兩種情況。因此在寫析構函數時你必須保守地假設有異常被激活,因為假如在一個異常被激活的同時,析構函數也拋出異常,并導致程序控制權轉移到析構函數外,C++將調用terminate函數。這個函數的作用正如其名字所表示的:它終止你程序的運行,而且是立即終止,甚至連局部對象都沒有被釋放。

  下面舉一個例子,一個session類用來跟蹤在線計算機的sessions,session就是運行在從你一登錄計算機開始一直到注銷出系統為止的這段期間的某種東西。每個Session對象關注的是它建立與釋放的日期與時間:

class Session {
public:
 Session();
 ~Session();
 ...
PRivate:
 static void logCreation(Session *objAddr);
 static void logDestrUCtion(Session *objAddr);
};
  函數logCreation 和 logDestruction被分別用于記錄對象的建立與釋放。我們因此可以這樣編寫Session的析構函數:

Session::~Session()
{
 logDestruction(this);
}
  一切看上去很好,但是假如logDestruction拋出一個異常,會發生什么事呢?異常沒有被Session的析構函數捕捉住,所以它被傳遞到析構函數的調用者那里。但是假如析構函數本身的調用就是源自于某些其它異常的拋出,那么terminate函數將被自動調用,徹底終止你的程序。這不是你所希望發生的事情。程序沒有記錄下釋放對象的信息,這是不幸的,甚至是一個大麻煩。那么事態果真嚴重到了必須終止程序運行的地步了么?假如沒有,你必須防止在logDestruction內拋出的異常傳遞到Session析構函數的外面。唯一的方法是用try和catch blocks。一種很自然的做法會這樣編寫函數:

Session::~Session()
{
 try {
  logDestruction(this);
 }
 catch (...) {
  cerr << "Unable to log destruction of Session object "
   << "at address "
   << this
   << "./n";
 }
}
  但是這樣做并不比你原來的代碼安全。假如在catch中調用Operator<<時導致一個異常被拋出,我們就又碰到了老問題,一個異常被轉遞到Session析構函數的外面。

  我們可以在catch中放入try,但是這總得有一個限度,否則會陷入循環。因此我們在釋放Session時必須忽略掉所有它拋出的異常:

Session::~Session()
{
 try {
  logDestruction(this);
 }
 catch (...) { }
}
  catch表面上似乎沒有做任何事情,這是一個假象,實際上它阻止了任何從logDestruction拋出的異常被傳遞到session析構函數的外面。我們現在能高枕無憂了,無論session對象是不是在堆棧輾轉開解(stack unwinding)中被釋放,terminate函數都不會被調用。

  不答應異常傳遞到析構函數外面還有第二個原因。假如一個異常被析構函數拋出而沒有在函數內部捕捉住,那么析構函數就不會完全運行(它會停在拋出異常的那個地方上)。假如析構函數不完全運行,它就無法完成希望它做的所有事情。例如,我們對session類做一個修改,在建立session時啟動一個數據庫事務(database transaction),終止session時結束這個事務:

Session::Session() // 為了簡單起見,,
{ // 這個構造函數沒有
 // 處理異常
 logCreation(this);
 startTransaction(); // 啟動 database transaction
}

Session::~Session()
{
 logDestruction(this);
 endTransaction(); // 結束database transaction
}
  假如在這里logDestruction拋出一個異常,在session構造函數內啟動的transaction就沒有被終止。我們也許能夠通過重新調整session析構函數內的函數調用順序來消除問題,但是假如endTransaction也拋出一個異常,我們除了回到使用try和catch外,別無選擇。

  綜上所述,我們知道禁止異常傳遞到析構函數外有兩個原因,第一能夠在異常轉遞的堆棧輾轉開解(stack-unwinding)的過程中,防止terminate被調用。第二它能幫助確保析構函數總能完成我們希望它做的所有事情。(假如你仍然不很信服我所說的理由,可以去看Herb Sutter的文章Exception-Safe Generic Containers ,非凡是“Destructors That Throw and Why They’re Evil”這段)。

上一篇:C 編程最佳實踐

下一篇:S-DES

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品国产精品| 欧美三级xxx| 国产丝袜一区二区三区免费视频| 国产欧美精品va在线观看| 成人性生交大片免费看小说| 精品视频久久久久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美有码在线视频| 国产一区深夜福利| 亚洲色图激情小说| 国产成人亚洲精品| 日韩在线中文视频| 91国自产精品中文字幕亚洲| 国产精品jizz在线观看麻豆| 美女999久久久精品视频| 久久av.com| 国产欧美日韩高清| 国产精品高潮呻吟久久av黑人| 欧美视频在线看| 91沈先生作品| 欧美二区乱c黑人| 久久精品欧美视频| 综合国产在线视频| 精品亚洲夜色av98在线观看| 91精品国产91久久久久久最新| 国产精品亚洲аv天堂网| 一区二区欧美激情| 久久偷看各类女兵18女厕嘘嘘| 日韩成人在线观看| 超碰日本道色综合久久综合| 国产在线播放不卡| 国外成人在线视频| 亚洲精品福利视频| zzijzzij亚洲日本成熟少妇| 69**夜色精品国产69乱| 91九色单男在线观看| 亚洲国内高清视频| 国产99久久精品一区二区| 在线观看亚洲区| 日韩亚洲第一页| 中文字幕精品在线| 91久久久久久久一区二区| 欧美成人一二三| 亚洲国产高清自拍| 91久久久精品| 国产精品99久久99久久久二8| 亚洲人午夜色婷婷| 国产精品av网站| 国产亚洲在线播放| 欧美理论电影在线播放| 欧美精品精品精品精品免费| 亚洲影视中文字幕| 国产日韩在线播放| 亚洲国产精久久久久久| 国产91精品久| 久久91精品国产91久久久| 亚洲精品中文字幕av| 午夜精品久久久久久久久久久久| 成人免费视频网址| 福利视频导航一区| 九九九久久国产免费| 色狠狠av一区二区三区香蕉蜜桃| 国产精品亚洲片夜色在线| 日韩电影免费在线观看| 91九色蝌蚪国产| 都市激情亚洲色图| 欧美日韩国产二区| 九九热视频这里只有精品| 亚洲自拍偷拍在线| 91高清免费视频| 国产+成+人+亚洲欧洲| 欧美日韩精品国产| 2019中文字幕在线| 国产ts人妖一区二区三区| 久久精品国产91精品亚洲| 91国产精品91| 91国产精品91| 国产亚洲精品一区二555| 26uuu另类亚洲欧美日本一| y97精品国产97久久久久久| 欧美日韩国产黄| 亚洲国产一区二区三区四区| 日本电影亚洲天堂| 亚洲最新av网址| 一区二区亚洲精品国产| 97碰碰碰免费色视频| 亚洲网站在线播放| 亚洲人成在线播放| 91久久久久久久久| 久久91精品国产91久久久| 久久精品国产免费观看| 久久久国产一区二区| 疯狂欧美牲乱大交777| 国产欧美韩国高清| 亚洲一区中文字幕在线观看| 精品成人在线视频| 日韩亚洲欧美成人| 超碰97人人做人人爱少妇| 日韩电影免费在线观看中文字幕| 免费91在线视频| 在线视频日韩精品| 国产精品美女www爽爽爽视频| 亚洲电影在线看| 欧美精品生活片| 色综合男人天堂| 久久久国产成人精品| 97欧美精品一区二区三区| 色七七影院综合| 成人做爽爽免费视频| 久久九九国产精品怡红院| 欧美激情亚洲精品| 2020国产精品视频| 亚洲成成品网站| 日韩一区二区精品视频| 国产一区视频在线播放| 亚洲欧美日韩图片| 午夜精品久久久久久久男人的天堂| 欧美精品videosex极品1| 成人性生交大片免费观看嘿嘿视频| 日本一区二区在线播放| 另类天堂视频在线观看| 中文字幕欧美日韩精品| 中文字幕自拍vr一区二区三区| 日韩av一卡二卡| 色偷偷偷亚洲综合网另类| 懂色aⅴ精品一区二区三区蜜月| 91久久精品国产| 亚洲欧美日韩一区二区三区在线| 欧美午夜片在线免费观看| 欧美成aaa人片在线观看蜜臀| 国内外成人免费激情在线视频| 国产有码一区二区| 欧美在线视频观看免费网站| 4388成人网| 欧美精品做受xxx性少妇| 午夜精品久久久久久久久久久久久| 国产日韩视频在线观看| 韩剧1988免费观看全集| 免费97视频在线精品国自产拍| 欧美成年人网站| 亚洲国产另类 国产精品国产免费| 亚洲成年网站在线观看| 色噜噜狠狠色综合网图区| 久久久久久久国产精品| 性色av一区二区咪爱| 久久影视电视剧免费网站清宫辞电视| 亚洲视频在线视频| 国产热re99久久6国产精品| 青草青草久热精品视频在线网站| 亲子乱一区二区三区电影| 国产亚洲精品久久久优势| 狠狠躁夜夜躁人人爽超碰91| 日韩hd视频在线观看| 国产成人在线播放| 成人女保姆的销魂服务| 国产手机视频精品| 自拍偷拍亚洲欧美| 国产精品久久久91| 久久久久久欧美| 亚洲深夜福利网站| 欧美人在线视频| 日韩在线视频网| 亚洲国产女人aaa毛片在线| 欧美富婆性猛交|