На основе диапазона для цикла и 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=address, получил ==9347==ERROR: AddressSanitizer: heap-use-after-free on address 0x61500000fdb4 at pc 0x00010a4f1043 bp 0x7fff55710b70 sp 0x7fff55710b68. Он выходит из строя в vec.push_back(x + y), Когда x = = 0 и y = = 22 на моем компьютере.
2 ответов:
From std:: vector:: push_back:
Если новый размер() больше емкости (), то все итераторы и ссылки (включая последний итератор) становятся недействительными. В противном случае недействителен только итератор прошедшего конца.
Основанный на диапазоне цикл for использует итераторы внутренне. Использование
push_backможет привести к тому, что эти итераторы будут признаны недействительными.Edit: обратите внимание, что при
y == 22вы вставляете 65-й элемент в свой вектор. Скорее всего, это емкость. было 64 года. Многие реализации увеличивают мощность на степени 2 (удваивая ее каждый раз).
Как только вы вызываете
std::vector::push_backили большинствоnon-constфункций, итераторы становятся недействительными (когда новый размер превышает текущую емкость вектора, что приводит к внутреннему перераспределению памяти)Вы можете найти несколько хороших ссылок на то, как работают стандартные контейнеры или итераторы в целом. Надеюсь, это поможет тебе начать!
Comments