【问题标题】:Exception Safety: Strong Guarantee vs Basic Guarantee异常安全:强保证 vs 基本保证
【发布时间】:2021-03-24 01:48:21
【问题描述】:

我现在正在尝试学习 C++,并且已经了解了异常安全的主题。我很确定我理解四个不同级别的异常安全的含义。但是,有哪些具体的例子可以说明强保证不合适而基本保证合适的情况?

【问题讨论】:

  • 最终,异常保证是关于确保对象处于一致状态,以便可以安全地销毁对象(基本保证)或撤消对象上的所有操作,以便对象恢复到之前的状态抛出异常时(强保证)。在必须在一系列步骤中更改对象,多个步骤已完成,然后可能引发异常的情况下,强保证是不合适的(因此已完成的步骤无法安全撤消,或者撤消所需的时间/资源)步骤是禁止的)。
  • @Peter:在基本保证的情况下抛出异常后,破坏不是唯一可能的操作。最低限度的基本保证允许调用任何没有先决条件的方法,例如is_open() 在文件上。

标签: c++ exception


【解决方案1】:

拥有强大的异常保证当然很好,在没有任何其他考虑的情况下应该提供。

但是,在某些情况下,提供强异常保证过于昂贵、过于复杂,甚至是不可能的。以下是一些示例:

  • 排序。如果排序谓词失败,您真的想要恢复原始排序的逻辑和存储吗?大多数用例不需要它。
  • 在不可变的仅附加日志或日志中捕获状态更改。也许您可以写一条记录说“取消此操作”,但您不能删除已写入的内容。
  • 内存已重新分配,数据已移动。将数据移回其原始位置可能毫无意义。例如,如果调整容器的大小,移动现有数据,然后追加新记录失败,将其调整到以前的大小可能会浪费时间,即使大小没有,也更容易保持新的更大容量改变。

在所有这些情况下,基本异常保证仍然有用,并且可能更合适。它可能允许程序在有效状态下继续,例如通过向用户返回错误消息。

【讨论】:

  • 例如,您通过网络发送了一些数据,然后出现“连接已丢失”之类的异常,基本上在这种情况下我们可以提供基本保证将只是继续数据块已丢失。
【解决方案2】:

例如,它可能是排序算法也经常使用的某种合并算法。

Scott Meyers 谈到基本保证

一些函数向调用者保证即使抛出异常, 程序不变量保持不变(没有数据结构被破坏)和 没有资源泄露。

所以,不变项在这里很重要,这就是为什么我决定多放 5 美分。

另外,值得一提的是,不变量可以与整个类相关,当然不是在每个语句之后,而是至少在处理和计算数据的某些关键点上必须是一致的。可以有一些特殊的方法来检查它是否是一个不变量。

据我所知,一个强有力的保证是,如果我们对内存进行快照,它应该和以前一样,可能很少在用户空间应用程序中使用,也不应该有任何副作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多