gsa*_*ras 22 c++ stl exception function vector
我试图了解异常如何影响std::vector.更准确地说,我想在抛出内存不足异常时检查向量的大小.
我的意思是这样的:
std::vector<int> v;
try {
for(unsigned int i = 0; i < desiredSize; ++i)
v.push_back(i);
}
catch (const std::bad_alloc&) {
cerr << "Out of memory! v.size() = " << v.size() << endl;
exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)
这是一个很好的方法,还是应该用我的独立变量跟踪向量的大小?
Que*_*tin 31
如果抛出异常(可能是由于
Allocator::allocate()元素复制/移动构造函数/赋值),则此函数无效(强异常保证).
因此,如果失败,push_back导致异常的最后一个将被回滚,但其他一切都将正常:您的向量将包含所有先前推送的元素,并将处于一致状态.
jot*_*tik 11
根据 [vector.modifiers](强调我的):
备注:如果新大小大于旧容量,则会导致重新分配.重新分配使引用序列中元素的所有引用,指针和迭代器无效.如果没有重新分配,插入点之前的所有迭代器和引用仍然有效. 如果除了复制构造函数之外抛出异常,则移动构造函数,赋值运算符或移动赋值运算符
T或通过任何InputIterator运算都没有效果. 如果在结尾插入单个元素时抛出异常并且T是CopyInsertable或者is_nothrow_move_constructible_v<T>为真,则没有任何效果.否则,如果非移动构造函数抛出异常,CopyInsertableT则不指定效果.
既然你T是int(并且对整数的操作从不抛出),你只能std::vector在尝试为其内容分配新内存时获得内存不足错误,因此抛出任何异常时此函数无效,size()之后使用是完美的有效的方法.