【问题标题】:Exception safe of containers in c++ [closed]c++中容器的异常安全[关闭]
【发布时间】:2016-02-05 09:02:15
【问题描述】:

我遇到了容器的异常安全这个术语。我想了解异常安全的确切含义是什么? 对于不同的容器,是否有任何比较?

【问题讨论】:

  • 有很多资源谈论异常安全。通常我们谈论levels of safety。像Herb Sutter 这样的知名专家写过关于如何实现这一目标的文章。
  • 我现在了解异常安全及其三种规范形式。但是容器的异常安全是什么意思呢?这是否意味着容器也可以抛出异常?
  • 由 scott meyers 编写的 Effective c++/stl 是一本书的起点......几乎所有容器都按照 c++ 规范提供了一些保证的异常安全性。

标签: c++ c++11 exception exception-handling exception-safety


【解决方案1】:

如果您查看各种数据结构的算法,您会发现它们涉及一系列步骤。数据结构在步骤的开始和结束时具有一定的完整性(一致的内部含义)。

例如,考虑vector,其中涉及dynamically growing array。这通常涉及一个数组、一个描述数组大小的整数和一个描述使用元素数量的整数。当插入一个元素时,可能会分配一个两倍大小的新数组,将元素复制到新数组,描述大小的整数将乘以 2,描述已使用元素数量的整数将增加 1,等等.

此时抛出的异常(例如,由元素的复制构造函数)可能导致步骤序列在中间终止。例如,如果您不小心先更新整数,然后才进行分配和复制(并且不捕获异常),那么数据结构将失去其内部一致性。

异常安全对于 STL 容器的意义在于,它们有保证这样的终止将使数据结构保持一致的状态。

【讨论】:

  • 是否有异常安全的 STL 容器?
  • 是的。基本上,它们都保证某种形式的异常安全。您应该将您的类设计为表现良好(例如,在析构函数中不是throw),并且可以通过支持移动语义来改进事情。请查阅各个容器文档以了解其保证。
  • 由 scott meyers 编写的 Effective c++ 是一本书的起点......几乎所有容器都按照 c++ 规范提供了一些保证的异常安全性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多