2012-08-27 48 views
7

通過亞伯拉罕,我們有3種類型的異常:強異常保證VS基本異常保證

  1. 拋出異常
  2. 基本異常保證
  3. 強異常保證

基本手段(請更正我如果我錯了),不變量被保留,例如組件的不變量被保存,沒有資源泄漏,wh強烈的是,操作已成功完成或拋出異常,使程序狀態與操作開始之前的狀態完全相同。

  1. 什麼意思是不變量被保留了?如果我在我的一個變量中有一個有效的值,那麼它不會(例如一個指針)持有NULL

  2. 引用Strong異​​常保證,是否意味着所有的變量都將在拋出異常之前存儲完全相同的值?

例如:

int main() 

{ 
    int j = 1; 
    int *p = &j; 

    // do some stuff 
    j = 2; 
    throw 1; 

} 

那麼我就扔出後,j將持有的價值21

Regards

+0

您引用了哪些參考? – paulsm4

+0

@ paulsm4:Wikipedia'http:// en.wikipedia.org/wiki/Exception_guarantees' – ron

+2

Dave Abrahams在[**異常 - 通用組件**中的安全性](http:// www.boost.org/community/exception_safety.html)。該文章在該部分頗爲令人信服地回答您的問題:***異常安全的合同基礎*** –

回答

2

在你的情況下,沒有例外保證。 (這基本上是情況0)。您引用的維基百科文章很清楚:「規則​​適用於類實現」。此外,拋出之後,變量j超出範圍並且不再存在。你甚至不能談論它的地址了,更不用說價值了,更不用說價值了

通常,類不變量由類作者定義,所以它意味着任何類作者的意思。我不明白你的觀點1. NULL是一個指針的有效值。

你的第二點是好的。這個定義並不是絕對的。例如,對字符串數據成員的操作可能會增加其容量。您可以通過const&在外面觀察。然而,字符串容量通常不被視爲字符串值的一部分,因此不作爲類不變量的一部分。

6
  1. 基本保證:拋出異常後,對象保持一致的可用狀態。沒有資源泄漏並保留invariants。對象的狀態可能已更改,但仍可用。例如,day值已變爲-1的日期對象不再可用。這是不變的說,day是在[1; 31]。

  2. 強有力的保證:(除1以外)日期對象的值爲2012-12-31。嘗試修改該值的操作失敗後,該對象的值仍爲2012-12-31。也許一些內部狀態已經改變,但客戶端視圖的邏輯狀態不變。