强大的异常保证VS基本异常保证

JAN*_*JAN 11 c++ exception-handling exception

通过Abrahams,我们有3种类型的例外:

  1. 不抛出
  2. 基本例外保证
  3. 强大的异常保证

基本方法(请纠正我,如果我错了)保留不变量,例如保留组件的不变量,没有资源泄露,操作已成功完成或抛出异常的强,离开程序状态与操作开始前完全一样.

  1. 保留不变量是什么意思?如果我的一个变量中有一个有效值,那么它不会(例如一个指针)持有一个NULL

  2. 参考强异常保证,是否意味着我的所有变量都会在抛出异常之前存储完全相同的值?

例如 :

int main()

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

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

}
Run Code Online (Sandbox Code Playgroud)

然后我扔了,j会持有价值2还是1

问候

han*_*aad 12

  1. 基本保证:抛出异常后,对象保持一致,可用的状态.没有资源泄露,并且保留了不变量.对象的状态可能已更改,但仍可使用.例如,其day值已变为-1 的日期对象不再可用,因为其不变量表示day在范围[1,31]内.

  2. 强保证(除1之外):日期对象的值为2012-12-31.尝试修改该值失败的操作后,该对象的值仍为2012-12-31.也许一些内部状态已经改变,但从客户的角度来看逻辑状态是不变的.


MSa*_*ers 5

在您的情况下,没有例外保证。(这基本上是情况 0)。您引用的维基百科文章很清楚:“规则​​适用于类实现”。此外,在您抛出之后,该变量j超出范围并且不再存在。你甚至不能再谈论它的地址,更不用说价值了

通常,类不变量是由类作者定义的,因此它意味着类作者的意思。我不明白你的观点 1.NULL是指针的有效值。

你的第二点很好。这个定义不是绝对的。例如,对字符串数据成员的操作可能会增加其容量。您可以通过const&. 然而,该字符串容量通常不被视为字符串值的一部分,因此也不被视为类不变量的一部分。