基于范围的loop和std :: vector.push_back()崩溃了程序


#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 =地址对其进行编译,获得了==9347==ERROR: AddressSanitizer: heap-use-after-free on address 0x61500000fdb4 at pc 0x00010a4f1043 bp 0x7fff55710b70 sp 0x7fff55710b68。当我的计算机上的x == 0时,它在vec.push_back(x + y)失败。

来自std :: vector :: push_back:

如果新的size()大于容量(),则所有迭代器和参考(包括过去的迭代器)都是无效的。否则,只有过去的迭代器被无效。

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

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

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

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

最新更新