[C++] Различия между unique_ptr и shared_ptr


Answers

unique_ptr - легкий интеллектуальный указатель выбора, если у вас есть только динамический объект, для которого у одного потребителя есть единственная (следовательно, «уникальная») ответственность - возможно, класс-оболочка, который должен поддерживать некоторый динамически выделенный объект. unique_ptr очень мало накладных расходов. Он не копируется, а движимый. Его тип - это template <typename D, typename Deleter> class unique_ptr; , поэтому он зависит от двух параметров шаблона.

unique_ptr также то, что auto_ptr хотел быть в старом C ++, но не мог из-за ограничений этого языка.

shared_ptr с другой стороны, совсем другое животное. Очевидное различие заключается в том, что у вас может быть много потребителей, разделяющих ответственность за динамический объект (следовательно, «общий»), и объект будет уничтожен только тогда, когда все общие указатели исчезнут. Кроме того, вы можете наблюдать слабые указатели, которые будут разумно информированы, если общий указатель, за которым они следуют, исчез.

Внутри shared_ptr имеет намного больше возможностей: существует счетчик ссылок, который обновляется атомарно, чтобы разрешить использование в параллельном коде. Кроме того, есть много вариантов распределения, один для внутреннего бухгалтерии «контрольный блок управления» и другой (часто) для фактического объекта-члена.

Но есть еще одна большая разница: тип общих указателей всегда является template <typename T> class shared_ptr; , и это несмотря на то, что вы можете инициализировать его с помощью пользовательских удалений и с помощью пользовательских распределителей. Делектор и распределитель отслеживаются с помощью стирания стилей и отправки виртуальных функций, что добавляет к внутреннему весу класса, но имеет огромное преимущество в том, что различные типы общих указателей типа T являются совместимыми, независимо от сведений о делеции и распределении. Таким образом, они действительно выражают концепцию «совместной ответственности за T », не обременяя потребителя деталями!

Оба shared_ptr и unique_ptr предназначены для передачи по значению (с очевидным требованием к движению для уникального указателя). Не стоит беспокоиться о накладных расходах, поскольку их сила действительно поразительна, но если у вас есть выбор, предпочитайте unique_ptr и используйте shared_ptr если вам действительно нужна общая ответственность.

Question

Возможные дубликаты:
pimpl: shared_ptr или unique_ptr
умные указатели (boost) объяснили

Может ли кто-нибудь объяснить различия между shared_ptr и unique_ptr?




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