boost :: ptr_container и std :: vector - PullRequest
6 голосов
/ 29 января 2011

После прочтения Ответы в Timdays на на этот вопрос Мне интересно узнать разницу между boost::ptr_container и std::vector<shared_ptr>.У меня сложилось впечатление, что a boost::ptr_container владеет указанными ему указателями , и после освобождения будет вызывать деструкторы всех содержащихся в нем указателей независимо от других ссылок на его обитателей.Что противоречит цели std::vector<shared_ptr>, который после освобождения будет освобождать только сами указатели, если число ссылок было 0?

Если это так (я полагаю, что нет), почему быдаже пример документации Boost сравнивает два , как если бы они были похожи по назначению, и почему в ответе Тимдея предлагается boost::ptr_container, когда он сильно отличается от цели std::vector<shared_ptr>.

Ответы [ 2 ]

9 голосов
/ 29 января 2011

Вы правы, эти два совершенно разные.

Первое отличие, как вы заметили, это семантика владения. Право собственности на элементы в контейнере указателя НЕ разделяется. В этом отношении boost::ptr_vector<T> намного ближе к std::vector<std::unique_ptr<T>>.

Но это не единственная разница!

  • если явно не указано в типе, контейнер указателей не будет содержать нулевого указателя
  • Контейнер указателя имеет глубокую семантику копирования (с использованием метода new_clone) и может быть скопирован, только если удерживаемый объект является копируемым
  • Контейнер-указатель имеет глубокую константную семантику, то есть если контейнер имеет значение const, тогда невозможно изменить один из его элементов.

Что касается того, почему @timday был вынужден упомянуть Boost Pointer Container, я думаю, это потому, что он хотел немного расширить вопрос. Контейнер Boost Pointer очень похож на Smart Pointers, который может содержать несколько объектов и обеспечивает более приятный синтаксис, чем контейнеры указателей в целом.

Что касается его сравнения с std::vector< boost::shared_ptr<T> > Я думаю, это просто потому, что это традиционный способ реализации вектора указателей при отсутствии семантики перемещения (нет unique_ptr), поскольку auto_ptr нельзя использовать в контейнере STL , Люди просто не знают о контейнерах указателей большую часть времени ...

1 голос
/ 29 января 2011

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

Тимдей ответил на вопрос «Чем отличается следующий набор указателей [s]», указав на упущение в списке.

...