Почему vector.reserve (2), за которым следует v [0] = 2, считается неверным?

Итак, насколько я понимаю, резерв не инициализирует абстракции, а просто выделяет пространство для их хранения. Однако не должен ли v [0] всегда давать вам первую унитализированную память и не должен ли всегда назначать значение в нее?

3

Решение

Так как reserve не меняет размер вектора. Он перемещает вектор только в то место в памяти, где есть достаточно места, чтобы позволить размеру вектора увеличиваться, когда это становится необходимым.

Если вы хотите быть уверены, что можете позвонить v[0]=2, или даже v[1]=0, вы должны использовать resize(2)не reserve(2),

9

Другие решения

Потому что это вызывает неопределенное поведение. Автор библиотеки может на законных основаниях оставить адрес begin () как nullptr, пока вы не измените размер. Или установите его на 0xBAADFOOD. Или отформатируйте свой жесткий диск, когда вы пишете на него.

Теперь вероятнее всего, что это неинициализированная память. Так что ничего страшного не происходит, кроме кучи утверждений в отладке и того факта, что вектор лежит в своем состоянии и никак не может его исправить.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector