Общая собственность: и стандарт принят в значительной степени так же , как их буста аналоги . Используйте их, когда вам нужно поделиться ресурсом, и не знаете, какой из них будет последним живым. Используйте для наблюдения общего ресурса, не влияя на его время жизни, чтобы не прерывать циклы. Циклы с обычно не должны происходить - два ресурса не могут владеть друг другом.
shared_ptr
weak_ptr
weak_ptr
shared_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_delete
r). 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();
это потенциальное состояние гонки.