C 箴言 防止異常離開析構函式

2021-09-25 12:03:39 字數 699 閱讀 6984

c++ 並不禁止從析構函式中引發異常,但是這確實妨礙了實踐。至於有什麼好的理由,考慮: 

class widget // assume this might emit an exception 

}; void dosomething() 

// v is automatically destroyed here 

當 vector v 被析構時,它有責任銷毀它包含的所有 widgets。假設 v 中有十個 widgets,在銷毀第乙個的時候,丟擲乙個異常。其他 9個 widgets 仍然必須被銷毀(否則他們持有的任何資源將被洩漏),所以 v 應該呼叫它們的析構函式。但是假設在這個呼叫期間,第二個 widgets 的析構函式又丟擲乙個異常。現在有兩個異常同時在活動中,對於 c++ 來說這太多了。在非常巧合的條件下發生這樣兩個同時活動的異常,程式的執行會終止或者引發未定義行為。在本例中,將引發未定義行為。與此相同,使用任何標準庫容器(比如,list,set),任何 tr1中的容器,甚至是乙個陣列,都可能會引發未定義問題。並非必須是容器或陣列才會陷入麻煩。程式夭折或未定義行為是析構函式引發異常的結果,即使沒有使用容器或陣列也會如此。c++ 不喜歡引發異常的析構函式。 這比較容易理解,但是如果你的析構函式需要執行乙個可能失敗而丟擲異常的操作,該怎麼辦呢?例如,假設你與乙個資料庫連線類一起工作: 

class dbconnection ; // exception if closing fails 

C 箴言 避免析構函式呼叫虛函式

我對效能測試比較有興趣。這裡是從網上看到的討論效能測試和壓力測試的文章。其實,更準確地說,它講述了基於網路的產品的效能測試和壓力測試。並不能代表所有軟體型別的測試。權且貼過來,先解決有無問題,個人觀點可以在後面討論 效能測試就 是用來測試軟體在系統中的執行效能的。效能測試可以發生在各個測試階段中,即...

析構函式丟擲異常

看了下effective c 關於析構函式丟擲異常的一些描述。然後自己網上查了下。發現一篇說的不錯的。轉了。具體出處不知道是 1.丟擲異常 1.1 丟擲異常 也稱為拋棄異常 即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異常。該語句的格式為 throw 表示式 ...

C 異常以及異常與析構函式

1.丟擲異常 1.1 丟擲異常 也稱為拋棄異常 即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異常。該語句的格式為 throw 表示式 如果在try語句塊的程式段中 包括在其中呼叫的函式 發現了異常,且拋棄了該異常,則這個異常就可以被try語句塊後的某個catc...