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

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

11 голосов
/ 22 сентября 2008

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

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

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

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

boost::ptr_vector<X>

or

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

Ответы [ 3 ]

13 голосов
/ 22 сентября 2008

Контейнеры-указатели Boost строго контролируют ресурсы, которыми они владеют. Std :: vector > имеет общее право собственности. Есть причины, по которым это может быть необходимо, но если это не так, я бы по умолчанию увеличил :: ptr_vector . YMMV.

3 голосов
/ 22 сентября 2008

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

2 голосов
/ 22 сентября 2008

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

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

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

...