STL和异常

3

如果我使用reserve()为向量保留足够的元素,那么push_back()(或insert())会抛出任何异常吗?

是否有一个参考文献指定哪些stl函数会/不会抛出任何异常?

谢谢。


你试过谷歌搜索“c++参考”吗?令人惊讶的是,第一个结果正是你要找的。 - log0
我不确定这个参考文献是否包含我需要的所有信息,因为我找不到任何保证函数不会抛出异常的地方。在这种情况下,我应该假设它意味着函数确实不会抛出异常,还是参考文献只是省略了这些信息? - twf
3个回答

5
如果我使用reserve()为向量保留足够的元素,push_back()(或insert())会抛出任何异常吗?
它不需要执行重新分配,因此向量本身不会抛出任何异常。但是,您要插入的元素在被复制到向量中时可能会引发异常,因此push_back和insert仍然可能会抛出异常。
有没有某个参考资料指定了哪些STL函数会/不会抛出任何异常?
是的,C++标准包含该信息。

4
我认为当复制构造函数抛出异常时,push_back会抛出异常。
现在,一个具有异常安全性的std::vector实现将保持push_backinsert调用之前vector的状态,以便您可以继续使用该对象。
此外,请参阅David Abrahams的从为C++标准库指定异常安全性中学到的教训

1
一个 vector 实际上无法实现强异常保证。它无法回滚到先前的状态,因为复制元素可能会抛出异常,而 vector 是通过值存储它们的。 vector 只提供基本保证(即向量将保留在有效状态,并且不会泄漏任何资源)。 - jalf
@jalf:你确定吗?我不记得那个纬度了。如果你向一个向量添加第六个元素并需要重新分配内存,则第四个复制构造函数可能会失败。但是在那时,原始的5个元素数组仍然存在。回滚可能甚至都不需要:只有在所有副本成功后才会交换指针。 - MSalters

0

我只能回答前面两个问题中的第一个。

方法 reserve(K)vector 上分配足够的空间来容纳 K 个元素,而不进行昂贵的重新分配,但如果有足够的插入操作,则 vector 的大小可以增长。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接