Указатели на элементы контейнеров STL
учитывая контейнер STL (вы также можете взять boost::unordered_map и boost::multi_index_container С учетом), который не является непрерывным, гарантируется ли, что адреса памяти элементов внутри контейнера никогда не изменяются, если элемент не удаляется (но новые могут быть добавлены)?
например
class ABC { };
//
//...
//
std::list<ABC> abclist;
ABC abc;
abclist.insert(abc);
ABC * abc_ptr = &(*abclist.begin());
другими словами будут abc_ptr указал abc на протяжении всего исполнения, если я не удаляю abc С abc_list.
Я спрашиваю это, потому что я собираюсь оберните класс ABC в C++ / Cli, поэтому мне нужны указатели на ABC экземпляры в классе-оболочке. ABC-это простой класс, и я хочу, чтобы контейнер обрабатывал память. Если ответ нет, то я буду использовать std::list<ABC*>.
4 ответов
std::list, std::set и std::map гарантируйте, что итераторы (включая простые указатели) не будут признаны недействительными при добавлении или даже удалении нового элемента.
Как упоминал Армен, std::list, std::set и std:: map гарантированно только аннулируют удаленный итератор. В случае boost::unodered_map модификаторы действительно могут аннулировать итераторы.
http://www.boost.org/doc/libs/1_38_0/doc/html/boost/unordered_map.html
стандарт C++ устанавливает строгие правила в отношении достоверности ссылок / итераторов. Для каждого контейнера каждый метод документирует, какие элементы мая быть перемещены (недействительные ссылки и итераторы).
Контейнеры На Основе Узлов:list, map, set, multimap и multiset гарантируйте, что ссылки и итераторы на элементы останутся действительными до тех пор, пока элемент не будет удален из контейнера.
ваш случай использования поэтому один из угловые случаи, когда используется list для хранения хорошо, из-за недействительности гарантирует, что предложение списка.
Я думаю, что лучше использовать std::list <shared_ptr <ABC> > вместо передачи указателя.
Рекомендуется делегировать управление памятью (см. Scott meyers effective c++)
Это имеет множество преимуществ:
- вы можете поделиться ими и передать их без головной боли для их освобождения
- сбор мусора указателей
- вы не передаете указатель в первую очередь