Вопрос

Мы все знаем, что НЕОБРАБОТАННЫЕ указатели должны быть обернуты в какую-либо форму интеллектуального указателя, чтобы обеспечить безопасное для исключений управление памятью.Но когда дело доходит до контейнеров с указателями, проблема становится более острой.

Контейнеры 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 ++, но, по моему опыту, вы также не увидите так много умных указателей.Существует множество совершенно безопасных для исключений классов, реализованных с использованием контейнеров необработанных указателей.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top