作者:米斯特RAO | 来源:互联网 | 2023-02-04 15:20
我试图了解异常如何影响std::vector
.更准确地说,我想在抛出内存不足异常时检查向量的大小.
我的意思是这样的:
std::vector v;
try {
for(unsigned int i = 0; i
这是一个很好的方法,还是应该用我的独立变量跟踪向量的大小?
1> Quentin..:
从以下文档std::vector::push_back
:
如果抛出异常(可能是由于Allocator::allocate()
元素复制/移动构造函数/赋值),则此函数无效(强异常保证).
因此,如果失败,push_back
导致异常的最后一个将被回滚,但其他一切都将正常:您的向量将包含所有先前推送的元素,并将处于一致状态.
@gsamaras:异常安全是重用标准容器和类型的主要好处之一.
2> jotik..:
根据 [vector.modifiers](强调我的):
备注:如果新大小大于旧容量,则会导致重新分配.重新分配使引用序列中元素的所有引用,指针和迭代器无效.如果没有重新分配,插入点之前的所有迭代器和引用仍然有效.
如果除了复制构造函数之外抛出异常,则移动构造函数,赋值运算符或移动赋值运算符T
或通过任何InputIterator
运算都没有效果.
如果在结尾插入单个元素时抛出异常并且T
是CopyInsertable
或者is_nothrow_move_constructible_v
为真,则没有任何效果.否则,如果非移动构造函数抛出异常,CopyInsertable
T
则不指定效果.
既然你T
是int
(并且对整数的操作从不抛出),你只能std::vector
在尝试为其内容分配新内存时获得内存不足错误,因此抛出任何异常时此函数无效,size()
之后使用是完美的有效的方法.