new - vector c++ remove one element




拋出異常後,我可以信任vector:: size嗎? (2)

我試圖了解異常如何影響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);
}

這是一個很好的方法,還是應該用我的獨立變量跟踪向量的大小?


std::vector::push_back的文檔

如果拋出異常(可能是由於Allocator::allocate()或元素複製/移動構造函數/賦值),則此函數無效(強異常保證)。

因此,如果失敗,導致異常的最後一個push_back將被回滾,但其他一切都會正常:您的向量將包含所有先前推送的元素,並且將處於一致狀態。


根據[vector.modifiers]強調我的):

備註:如果新大小大於舊容量,則會導致重新分配。 重新分配使引用序列中元素的所有引用,指針和迭代器無效。 如果沒有重新分配,插入點之前的所有迭代器和引用仍然有效。 如果除了複製構造函數之外拋出異常,移動構造函數,賦值運算符或T移動賦值運算符,或者通過任何InputIterator操作都沒有效果。 如果在末尾插入單個元素時拋出異常且TCopyInsertableis_nothrow_move_constructible_v<T>為真,則沒有效果。 否則,如果非CopyInsertable T的移動構造函數拋出異常, CopyInsertable指定效果。

由於你的Tint (並且對整數的操作從不拋出),你只能在std::vector嘗試為其內容分配新內存時得到內存不足錯誤,因此拋出任何異常時此函數無效然後使用size()是一種非常有效的方法。







stl