2011-01-29 3 views
6

После прочтения timdays answer к this question мне любопытно о разнице между boost::ptr_container и std::vector<shared_ptr>. У меня создалось впечатление, что a boost::ptr_container had ownership over the pointers given to it, и после релиза назвал бы деструкторов всех указателей, которые он содержал, независимо от других ссылок на его жителей. Что противоречит назначению std::vector<shared_ptr>, которое после выпуска выпустило бы только сами указатели, если количество ссылок было 0?повышение :: ptr_container и станд :: вектор <shared_ptr>

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

ответ

7

Вы правы, эти два варианта отличаются друг от друга.

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

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

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

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

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

1

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

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