Дан фрагмент на C++: 'std::vector v; v.reserve(2); v.push_back(1); v.push_back(2); int* p = &v[0]; v.push_back(3); std::cout <

1 Июн в 16:48
8 +1
0
Ответы
1
Код некорректен — поведение неопределено.
Почему:
- После `v.reserve(222)` ёмкость вектора не меньше 222.
- Два вызова `v.push_back(111)` и `v.push_back(222)` дают `size() == 222` и `capacity() >= 222`.
- `int* p = &v[0];` даёт указатель на элемент в внутреннем массиве.
- Следующий `v.push_back(333)` превышает текущую ёмкость 222, поэтому вектор выполнит реаллокацию: выделит новый буфер (обычно большей ёмкости, например 444), скопирует/переместит элементы и освободит старый. При реаллокации все указатели/ссылки/итераторы на элементы инвалидируются.
- Следовательно `p` становится висячим указателем, а `std::cout << *p;` — неопределённое поведение (может печатать что угодно или привести к краху).
Как сделать корректно: заранее `v.reserve(333)`, или после пушей заново получить `p = v.data()`, либо использовать индекс `v[0]` непосредственно, не сохраняя старый указатель.
1 Июн в 16:54
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир