Указатели и контейнеры
-
02-07-2019 - |
Вопрос
Мы все знаем, что НЕОБРАБОТАННЫЕ указатели должны быть обернуты в какую-либо форму интеллектуального указателя, чтобы обеспечить безопасное для исключений управление памятью.Но когда дело доходит до контейнеров с указателями, проблема становится более острой.
Контейнеры std настаивают на том, чтобы содержащийся объект был копируемым, поэтому это исключает использование std:: auto_ptr , хотя вы все еще можете использовать boost::shared_ptr и т.д.
Но есть также некоторые контейнеры boost, явно предназначенные для безопасного хранения указателей:
Видишь Библиотека контейнеров указателей
Вопрос в том,:При каких условиях я должен предпочесть использовать ptr_containers вместо контейнера smart_pointers?
boost::ptr_vector<X>
or
std::vector<boost::shared_ptr<X> >
Решение
Контейнеры указателей повышения имеют строгое право собственности на ресурсы, которые они содержат.STD:: vector<boost::shared_ptr<X>> имеет общую собственность.Есть причины, по которым это может быть необходимо, но в случае, если это не так, я бы по умолчанию использовал boost::ptr_vector<X>.ИММВ.
Другие советы
Держись крепче:интеллектуальные указатели - очень хороший метод управления ресурсами, но не единственный.Я согласен, что вы увидите очень мало необработанных указателей в хорошо написанном коде на C ++, но, по моему опыту, вы также не увидите так много умных указателей.Существует множество совершенно безопасных для исключений классов, реализованных с использованием контейнеров необработанных указателей.
Ну, накладные расходы - это один случай.
Вектор общих указателей будет выполнять много постороннего копирования, которое включает в себя создание нового интеллектуального указателя, увеличение ссылки, уменьшение ссылки и т.д. При изменении размера.Всего этого можно избежать с помощью контейнера указателей.
Требуется профилирование, чтобы гарантировать, что контейнерные операции являются узким местом, хотя :)