抛出异常后,我可以信任vector :: size吗?

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

以下文档std::vector::push_back:

如果抛出异常(可能是由于Allocator::allocate()元素复制/移动构造函数/赋值),则此函数无效(强异常保证).

因此,如果失败,push_back导致异常的最后一个将被回滚,但其他一切都将正常:您的向量将包含所有先前推送的元素,并将处于一致状态.

  • @gsamaras:异常安全是重用标准容器和类型的主要好处之一. (12认同)

jot*_*tik 11

根据 [vector.modifiers](强调我的):

备注:如果新大小大于旧容量,则会导致重新分配.重新分配使引用序列中元素的所有引用,指针和迭代器无效.如果没有重新分配,插入点之前的所有迭代器和引用仍然有效. 如果除了复制构造函数之外抛出异常,则移动构造函数,赋值运算符或移动赋值运算符T或通过任何InputIterator运算都没有效果. 如果在结尾插入单个元素时抛出异常并且TCopyInsertable或者is_­nothrow_­move_­constructible_­v<T>为真,则没有任何效果.否则,如果非移动构造函数抛出异常,CopyInsertable T则不指定效果.

既然你Tint(并且对整数的操作从不抛出),你只能std::vector在尝试为其内容分配新内存时获得内存不足错误,因此抛出任何异常时此函数无效,size()之后使用是完美的有效的方法.