На основе диапазона для цикла и 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 на моем компьютере.

489   2  

2 ответов:

From std:: vector:: push_back:

Если новый размер() больше емкости (), то все итераторы и ссылки (включая последний итератор) становятся недействительными. В противном случае недействителен только итератор прошедшего конца.

Основанный на диапазоне цикл for использует итераторы внутренне. Использование push_back может привести к тому, что эти итераторы будут признаны недействительными.

Edit: обратите внимание, что при y == 22 вы вставляете 65-й элемент в свой вектор. Скорее всего, это емкость. было 64 года. Многие реализации увеличивают мощность на степени 2 (удваивая ее каждый раз).

Как только вы вызываете std::vector::push_back или большинство non-const функций, итераторы становятся недействительными (когда новый размер превышает текущую емкость вектора, что приводит к внутреннему перераспределению памяти)

Вы можете найти несколько хороших ссылок на то, как работают стандартные контейнеры или итераторы в целом. Надеюсь, это поможет тебе начать!

Comments

    Ничего не найдено.