当STL容器抛出异常时,如何找出确切的条件?

时间:2014-07-24 00:05:13

标签: c++ exception stl

对于STL容器(到目前为止,std::vector<>std::deque<>),我正在寻找准确说明何时抛出异常的文档。类似的事情,“它在情况A中抛出X.它在情况B中抛出Y.在任何情况下都不会抛出其他异常。”

我想向我的异常恐惧同事保证,我们确切知道什么可以触发我们使用的STL类中的异常。

2 个答案:

答案 0 :(得分:4)

最准确的信息将来自与您的编译器和编译器文档匹配的C ++标准。但是,这个规格要花钱。如果你愿意接受一些拼写错误,可以在这里找到C ++ 11规范草案:http://open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf免费,最新的公开草案(准备C ++ 14)似乎是{ {3}}

数字1使用的容器是vector,所以让我们重点介绍一下。

从技术上讲,如果给定超出范围的索引,则抛出异常的唯一vector成员是at。 (tada!我们已经完成了!)

从技术上讲,vector赋值/ insert / emplace / reserve / resize / push_back / emplace_back / shrink_to_fit / etc会导致调整大小,使用std::allocator<T>:allocate,可以抛出std::bad_alloc理论。在奇怪的情况下,奇怪的分配器,交换也可以触发它。在某些系统(Linux)上,这种情况几乎从未发生过,因为它只会在虚拟内存耗尽时抛出,并且程序通常会先耗尽物理内存,操作系统将简单地杀死整个程序。然而,无论例外如何都会发生这种情况,因此这不会计入C ++异常。

可能相关的是向量中的元素在复制时可以抛出任何异常,这会影响构造函数,赋值,插入/ emplace / push_back / emplace_back,reserve,resize / shrink_to_fit。 (如果你的元素有一个noexcept移动构造函数并且移动赋值,并且它真的真的应该,那么只有在复制整个向量时才会发生。)

该规范详细说明了抛出的异常,并且通常还指定了它们被抛出的确切条件。

答案 1 :(得分:1)

C ++标准文档在何时抛出异常以及在什么情况下标准库容器。关于哪些方法不会为容器抛出异常,也有一般规则。

或者,您可以在标题中搜索throw(或等效的宏)以确定在什么情况下会触发异常。