MiddleДебаггингОчень частоЕщё не отвечали
Почему *p повисает после push_back?
Здесь кэшируется указатель внутрь вектора, затем в него добавляется элемент.
std::vector<int> v{1, 2, 3};
int* p = &v[0];
v.push_back(4); // может перевыделить память
std::cout << *p;
Найдите и исправьте ошибку.
push_back может перевыделить память вектора при росте за пределы вместимости, инвалидируя p, который теперь висячий — UB. Указатели, ссылки и итераторы внутрь vector инвалидируются перевыделением. Решение: заново получить p после вставки или reserve вместимости заранее.
- ✗Считать, что push_back никогда не перемещает существующие элементы
- ✗Думать, что сырые указатели переживают перевыделение вектора, а итераторы — нет
- ✗Забывать, что рост вместимости перемещает весь буфер
- →Когда именно
vector::push_backинвалидирует ссылки и итераторы? - →Как
reserveделает сериюpush_backустойчивой к инвалидации указателей?