2017-01-09 4 views
2

Как указано в answer to another question, все указатели на элементы вектора могут стать недействительными после добавления новых элементов к этому вектору из-за перераспределения лежащего в основе смежного буфера.Обработка ссылок, связанных с добавлением элементов в std :: vector

Есть ли безопасный способ справиться с этой проблемой во время компиляции?

Существуют ли лучшие методы борьбы с ситуацией или исключения из нее, когда ссылки могут стать недействительными после изменения структуры данных?

+0

в C# Я получаю исключение, когда добавляю элементы во время итерата или активен. Могу ли я воссоздать это поведение в C++? – wotanii

+0

Могу я сказать компилятору, чтобы он выдавал ошибку всякий раз, когда я хранил ссылку на элемент в векторе? Если это так, я могу обойти проблему, всегда получая элемент по его индексу. – wotanii

ответ

-1

Указатель или ссылка на сам std :: vector не изменится. Что может изменить адрес определенного элемента внутри std :: vector из-за политики перераспределения, которая зависит от реализации.

Предораспределение достаточного пространства - это риск, потому что вы не должны передавать определенную политику реализации.

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

+0

Это должен быть комментарий, а не ответ. Я думаю, что можно с уверенностью предположить, что это то, что имел в виду OP, это было просто сформулировано плохо. –

1

Есть ли лучшие практики для устранения ситуации или предотвращения ситуации, когда ссылки могут стать недействительными после изменения структуры данных?

  • заранее выделить достаточно места для вектора заранее
  • Keep индекс объекта в массиве вместо ссылки/указатель на сам объект
  • использовать другой контейнер, например std::list

каким путем будет работать для вас, лучший способ зависит от вашей ситуации