'的std :: bad_alloc的'在向量上使用迭代器时甚至是错误的向量大小

时间:2015-10-04 13:14:23

标签: c++ c++11 vector stl

我试图将额外的字符串推送到向量的中间时得到terminate called after throwing an instance of 'std::bad_alloc'。我使用了g ++ 4.8.2。

coliru上使用g ++ 5.2时,我甚至得到了错误的矢量大小size of str_vector 0: 1, size of str_vector 1: 1的输出。

当我使用索引(例如str_vector[0])访问向量或使用std::list时,程序正常工作。

这是否意味着对iterator的使用有一些限制?我假设当我使用索引或迭代器访问向量时应该没有任何区别。

#include <iostream>
#include <string>
#include <vector>

using std::vector;
using std::string;

int main() {
        vector<vector<string>> str_vector;

        str_vector.emplace_back();
        vector<vector<string>>::iterator it0 = std::prev(str_vector.end());
        it0->push_back("a");

        str_vector.emplace_back();
        vector<vector<string>>::iterator it1 = std::prev(str_vector.end());
        it1->push_back("a");

        it0->push_back("a"); // bad alloc here

        std::cerr << "size of str_vector 0: " << it0->size() << std::endl;
        std::cerr << "size of str_vector 1: " << it1->size() << std::endl;

        return 0;
}

2 个答案:

答案 0 :(得分:3)

向向量添加元素时,可能需要重新分配其内部内存,这会导致所有迭代器变为无效。因此,在执行第二个emplace_back之后,第一个迭代器it0将变为无效。

答案 1 :(得分:1)

迭代器只不过是面向对象的指针。迭代器失效很像指针失效。

C ++规范:

  

vector:插入点之前的所有迭代器和引用   不受影响,除非新容器的大小大于之前的容器   容量(在这种情况下,所有迭代器和引用都无效)   [23.2.4.3/1]

第一次执行下面的行时,它是有效的。第二次使用相同的迭代器,迭代器已经失效:

    it0->push_back("a"); // bad alloc here

要知道迭代器失效是什么以及如何处理它,这里有关于迭代器失效的优秀帖子:

[Iterator invalidation rules