2016-02-05 43 views
1

我遇到这个术语异常安全的容器。我想了解究竟什么是异常安全的意思? 对于不同的容器是否有任何比较?在C++中的容器的异常安全

+0

https://en.wikipedia.org/wiki/Exception_safety –

+1

有很多关于异常安全的资源。通常我们谈论[*安全级别](https://en.wikipedia.org/wiki/Exception_safety)。高级专家如[Herb Sutter](http://www.gotw.ca/gotw/059.htm)已经写了关于如何实现这一点的文章。 – BoBTFish

+0

我了解现在的异常安全及其三种规范形式。但是,容器的异常安全是什么意思?这是否意味着即使容器可以抛出异常? – Barry

回答

1

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

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

此时引发的异常(例如,通过元素的复制构造函数)可能会导致中间的步骤序列被终止。例如,如果你不小心首先更新整数,那么只有在分配和复制(并且不捕获异常)时,数据结构才会失去内部一致性。

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

+0

是否有任何STL容器是异常安全的? – Barry

+0

是的。基本上,它们各自保证某种形式的例外安全。你应该将你的类设计得很好(例如,不要在析构函数中抛出),并且可以通过支持移动语义来改进。请查阅单个容器文档以获取其保证。 –

+0

由scott meyers编写的有效C++是本书的开始....几乎所有的容器都按照C++规范提供了一些严格的异常安全性。 – basav