#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)
处失败。
答案 0 :(得分:9)
如果new size()大于capacity(),则所有迭代器和引用(包括last-the-end迭代器)都将失效。否则只有过去的迭代器无效。
基于范围的for循环在内部使用迭代器。使用push_back
可能会导致这些迭代器失效。
编辑:请注意,当y == 22
将第65个元素插入向量时。容量可能是64.许多实现以2的幂增加容量(每次加倍)。
答案 1 :(得分:0)
一旦你调用std::vector::push_back
或大多数non-const
函数,迭代器就会失效(当新大小超过向量的当前容量时,会导致内部重新分配内存)< / p>
您可以找到有关标准容器或迭代器如何工作的一些很好的参考。我希望能让你开始!