Указатель на элемент vector после push_back
std::vector<int> v{1, 2, 3};
int *p = &v[0];
v.push_back(4);
std::cout << *p << "\n";
Код собран без предупреждений и в отладочной сборке печатает 1. На другой машине он печатает произвольное число, а под санитайзером падает. Какое утверждение верно?
- Всегда печатается 1: добавление элемента в конец не меняет ни значение, ни расположение первого элемента
- push_back может перевыделить буфер, и тогда p указывает на освобождённую память — поведение не определено
- Печатается 4: push_back сдвигает уже имеющиеся элементы к началу буфера, а новый кладёт на освободившееся место
- Код не соберётся: брать адрес элемента vector нельзя, operator[] возвращает временный объект
