Безопасно ли перераспределение std ::vector::data()?

#c #pointers #stdvector

#c #указатели #стдвектор

Вопрос:

Насколько я знаю, использование указателя или ссылки на std::vector элемент считается плохой практикой. Но о чем же std::vector::data() ? Остается ли указатель, полученный с помощью data() , действительным после перераспределения?

Комментарии:

1. Нет, он не остается действительным после перераспределения.

2. Нет. Все указатели и итераторы становятся недействительными при перераспределении.

Ответ №1:

Насколько я знаю, использование указателя или ссылки на элемент std::vector считается плохой практикой.

Ссылки и указатели могут избежать накладных расходов на копирование, что является неплохой практикой, если вы можете гарантировать, что std::vector они не будут перераспределены в течение срока службы ссылки или указателя.

(Кстати, в C нет необходимости использовать указатели, когда вы можете использовать ссылки)

Но как насчет std::vector::data()? Остается ли указатель, полученный data(), действительным после перераспределения?

Нет. Перераспределение может привести к изменению указателя. Использование старого указателя после перераспределения — это неопределенное поведение. То же самое для итераторов.

Комментарии:

1. Полностью согласен. Это не получение указателей или ссылок, что следует избегать, а хранение (особенно в нелокальных переменных, таких как члены объектов) указателей или ссылок на векторные элементы.