Общая собственность: и стандарт принят в значительной степени так же , как их буста аналоги . Используйте их, когда вам нужно поделиться ресурсом, и не знаете, какой из них будет последним живым. Используйте для наблюдения общего ресурса, не влияя на его время жизни, чтобы не прерывать циклы. Циклы с обычно не должны происходить - два ресурса не могут владеть друг другом.
shared_ptrweak_ptrweak_ptrshared_ptr
Обратите внимание, что Boost дополнительно предлагает shared_array, что может быть подходящей альтернативой shared_ptr<std::vector<T> const>.
Далее, Повышение предложение intrusive_ptr, которые являются легким решением , если ваши предложения ссылки на ресурс подсчет управления уже и вы хотите принять его к принципу RAII. Этот не был принят стандартом.
Уникальное владение:
Boost также имеет scoped_ptr, который не копируется и для которого вы не можете указать удалитель. std::unique_ptrэто boost::scoped_ptrна стероидах и должен быть ваш выбор по умолчанию , если вам нужен смарт - указатель . Это позволяет вам указывать удалитель в аргументах шаблона и является подвижным , в отличие от boost::scoped_ptr. Он также полностью применим в контейнерах STL, если вы не используете операции, для которых нужны копируемые типы (очевидно).
Еще раз отметим, что Boost имеет версию массива: scoped_arrayстандарт унифицирован, требуя std::unique_ptr<T[]>частичной специализации, которая будет delete[]указателем вместо deleteнего (с default_deleter). std::unique_ptr<T[]>также предлагает operator[]вместо operator*и operator->.
Обратите внимание, что std::auto_ptrвсе еще в стандарте, но это устарело .
§D.10 [depr.auto.ptr]
Шаблон класса auto_ptrустарел. [ Примечание: шаблон класса unique_ptr(20.7.1) предоставляет лучшее решение. —Конечная записка ]
Без владения:
используйте тупые указатели (необработанные указатели) или ссылки для не владеющих ссылками на ресурсы, а также когда вы знаете, что ресурс переживет ссылающийся объект / область. Предпочитайте ссылки и используйте необработанные указатели, когда вам нужно обнулять или сбрасывать.
Если вы хотите не принадлежащую ссылку на ресурс, но не знаете, переживет ли ресурс объект, который на него ссылается, упакуйте ресурс в shared_ptrи используйте weak_ptr- вы можете проверить, shared_ptrжив ли родительский объект lock, что вернуть shared_ptrненулевое значение, если ресурс все еще существует. Если хотите проверить, мертв ли ресурс, используйте expired. Оба могут показаться похожими, но сильно отличаются друг от друга в условиях одновременного выполнения, так как expiredгарантируют только возвращаемое значение для этого единственного оператора. Казалось бы, невинный тест, как
if(!wptr.expired())
something_assuming_the_resource_is_still_alive();
это потенциальное состояние гонки.