Указатели на элементы контейнеров 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++)
Это имеет множество преимуществ:
- вы можете поделиться ими и передать их без головной боли для их освобождения
- сбор мусора указателей
- вы не передаете указатель в первую очередь