基于范围的for循环和std :: vector.push_back()使程序崩溃

时间:2017-02-24 21:06:50

标签: c++ c++11

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec;
    for (int i = 0; i < 42; ++i) {
        vec.push_back(i);
        vec.push_back(-i);
    }
    for (int x: vec) {
        for (int y: vec) {
            vec.push_back(x + y);
        }
    }
    for (int x: vec) {
        std::cout << x << "\n";
    }
}

导致此代码崩溃的原因是什么?我尝试用-fsanitize = address编译它,得到==9347==ERROR: AddressSanitizer: heap-use-after-free on address 0x61500000fdb4 at pc 0x00010a4f1043 bp 0x7fff55710b70 sp 0x7fff55710b68。在我的计算机上x == 0和y == 22时,它在vec.push_back(x + y)处失败。

2 个答案:

答案 0 :(得分:9)

来自std::vector::push_back

  

如果new size()大于capacity(),则所有迭代器和引用(包括last-the-end迭代器)都将失效。否则只有过去的迭代器无效。

基于范围的for循环在内部使用迭代器。使用push_back可能会导致这些迭代器失效。

编辑:请注意,当y == 22将第65个元素插入向量时。容量可能是64.许多实现以2的幂增加容量(每次加倍)。

答案 1 :(得分:0)

一旦你调用std::vector::push_back或大多数non-const函数,迭代器就会失效(当新大小超过向量的当前容量时,会导致内部重新分配内存)< / p>

您可以找到有关标准容器或迭代器如何工作的一些很好的参考。我希望能让你开始!

相关问题