Подтвердить что ты не робот

Рекомендуемое использование std:: unique_ptr

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

Я обнаружил:

О характеристиках unique_ptr

Я уже знаю:

  • std::unique_ptr был разработан в С++ 11 в качестве замены std::auto_ptr
  • Что a std::unique_ptr не имеет счетчика ссылок и "владеет", он указывает на
  • Нет копии/назначения с std::unique_ptr
  • Когда мне нужен уникальный указатель, std::unique_ptr - это переход к структуре

Что я хотел бы знать:

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

Ответ 1

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

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

Наконец, необработанный указатель подходит для наблюдения - использование указателей, которое никогда не может повлиять на продолжительность жизни. Тщательный выбор правильного типа указателя может дать тем, кто читает ваш код, хорошее понимание того, что вы делаете. Более подробно см. Эссе Херба Саттера Элементы стиля С++, в частности раздел "no delete".