2013-03-18 4 views
23

Какие рекомендуемые применения std::unique_ptr в отношении того, где, когда и как его лучше всего использовать?Рекомендуемое использование std :: unique_ptr

я обнаружил:

About unique_ptr performances

Я уже знаю:

  1. std::unique_ptr был разработан в C++ 11 в качестве замены для std::auto_ptr
  2. То, что std::unique_ptr не имеет никакого подсчета ссылок и Объект «владеет» указывает на
  3. Нет копии/a ssign с std::unique_ptr
  4. Когда мне нужен уникальный указатель, std::unique_ptr это перейти к структуре

То, что я хотел бы знать:

  1. использует std::unique_ptr всегда предпочтительней (кроме уникальности) что-то
    еще? Что я получу в этой ситуации?
  2. Если да, то при каких обстоятельствах и когда?
  3. Учитывая потребность в семантике перемещения, это сделает std::unique_ptr менее благоприятным
    общий?
  4. Если std::shared_ptr будет достаточно для динамического управления памятью в почти каждой ситуации, почему имея в своем распоряжении std::unique_ptr вопрос (опять же, другие
    чем уникальность)?
+2

Поскольку тип называется 'unique_ptr', мне кажется странным, что вы ищете другое использование, чем уникальное ... –

+2

И [Какой тип указателя я использую, когда?] (Http://stackoverflow.com/q/8706192/256138) – rubenvb

+1

@ Mushy: Главный вопрос, на который вам нужно ответить, - это вопрос собственности. Ничто другое не имеет значения при выборе умного указателя, и на это очень хорошо отвечают вопросы, с которыми я связан. У вопроса, с которым вы связались, был мой downvote (из ранее), потому что он ничего не показывает окончательно и задает неправильный вопрос о «данных». – rubenvb

ответ

7

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

Однако, unique_ptr является подвижным, но не скопируемым, поэтому использование одного в качестве переменной-члена может потребовать, чтобы вы написали больше кода (например, конструктор перемещения), передав один по значению, вы должны будете использовать std::move и так далее , В результате некоторые люди используют shared_ptr из лени, потому что это просто проще, и разница между перформансом может быть не существенной для их приложения.

Наконец, необработанный указатель подходит для наблюдения - использование указателей, которое никогда не может повлиять на продолжительность жизни. Тщательный выбор правильного типа указателя может дать тем, кто читает ваш код, хорошее понимание того, что вы делаете. Подробнее см. Эссе Герба Саттера, Elements of C++ Style, в частности раздел «no delete».

+1

'= default' и неявные элементы перемещения могут легко позаботиться о дополнительном коде. – Puppy

+0

Если вам не нужен явный механизм перемещения перед добавлением 'unique_ptr', вам не понадобится конструктор явного перемещения. Единственная ситуация, в которой вам придется писать больше кода, - это когда вы сделали бы что-то, что отключает неявный конструктор перемещения. – Cubic

+0

@DeadMG Я все еще жду = default в моем компиляторе, но да –

Смежные вопросы