16

Abrahams によると、3 種類の例外があります。

  1. ノースロー
  2. 基本例外保証
  3. 強力な例外保証

コンポーネントの不変条件が保持され、リソースがリークされないなど、不変条件が保持される基本的な手段 (私が間違っている場合は修正してください)操作開始前とまったく同じです。

  1. 不変条件が保持されるとはどういう意味ですか? 変数の1つに有効な値がある場合、それは(たとえばポインターを使用して)保持されNULLませんか?

  2. 強力な例外保証について言及すると、例外がスローされる前にすべての変数がまったく同じ値を格納するということですか?

例えば ​​:

int main()

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

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

}

次に、 をスローした後、値または?jを保持しますか?21

よろしく

4

2 に答える 2

16
  1. 基本的な保証:例外がスローされた後、オブジェクトは一貫した使用可能な状態のままになります。リソースがリークされることはなく、不変条件が保持されます。オブジェクトの状態が変更された可能性がありますが、それでも使用可能です。たとえば、値が-1になった日付オブジェクトは、その不変条件が範囲[1、31]にdayあると言っているため、使用できなくなりました。day

  2. 強力な保証(1に追加):日付オブジェクトの値は2012-12-31です。その値を変更しようとする操作が失敗した後でも、そのオブジェクトの値は2012-12-31のままです。一部の内部状態が変更された可能性がありますが、クライアントの観点からの論理状態は変更されていません。

于 2012-08-27T07:22:07.693 に答える
5

あなたの場合、例外保証はありません。(これは基本的にケース 0 です)。あなたが引用したウィキペディアの記事は明確です:「ルールはクラスの実装に適用されます」。さらに、スローした後、変数jはスコープ外になり、存在しなくなります。値は言うまでもなく、そのアドレスについて話すことさえできません

通常、クラスの不変条件はクラスの作成者によって定義されるため、クラスの作成者が意味するものは何でも意味します。あなたのポイントがわかりません 1.NULLはポインターの有効な値です。

あなたの2番目の点は良い点です。定義は絶対的なものではありません。たとえば、文字列データ メンバーに対する操作によって、その容量が増加する場合があります。これは、 を介して外部から観察できますconst&。ただし、その文字列容量は通常、文字列値の一部とは見なされないため、クラスの不変条件の一部とは見なされません。

于 2012-08-27T07:19:10.443 に答える