Указатели и контейнеры

Мы все знаем, что указатели RAW необходимо обернуть в виде смарт-указателя, чтобы получить безопасное управление безопасностью Exception. Но когда дело доходит до контейнеров указателей, проблема становится более тернистой.

Контейнеры std настаивают на том, что содержащийся объект можно копировать, поэтому это исключает использование std:: auto_ptr, хотя вы все равно можете использовать boost:: shared_ptr и т.д.

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

Вопрос: В каких условиях я должен использовать ptr_containers над контейнером smart_pointers?

boost::ptr_vector<X>

or

std::vector<boost::shared_ptr<X> >

Ответ 1

Контейнеры с указателем указателей содержат строгое владение над ресурсами, которые они хранят. A std::vector < boost:: shared_ptr < X → имеет совместное владение. Есть причины, по которым это может быть необходимо, но в случае, если это не так, я бы по умолчанию увеличил:: ptr_vector <X> . YMMV.

Ответ 2

Устойчивый: умные указатели - очень хороший метод управления ресурсами, но не единственный. Я согласен, что вы увидите очень мало сырых указателей в хорошо написанном С++-коде, но, по моему опыту, вы также не видите много умных указателей. Существует множество совершенно безопасных классов, реализованных с использованием контейнеров необработанных указателей.

Ответ 3

Ну, накладные расходы - это один случай.

Вектор общих указателей сделает много постороннего копирования, которое включает в себя создание нового умного указателя, увеличение ссылки, уменьшение ссылки и т.д. при изменении размера. Все это можно избежать с помощью контейнера-указателя.

Требуется профилирование, чтобы гарантировать, что операции с контейнером являются узким местом:)