#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
功能,迭代器就会无效(当新大小超过导致内部内部重新分配内存的向量的当前容量时)
您可以找到有关标准容器或迭代器一般如何工作的好参考。我希望让您开始!