Загальна власність: і стандарт прийнятий в значній мірі так само , як їх буста аналоги . Використовуйте їх, коли вам потрібно поділитися ресурсом, і не знаєте, який з них буде останнім. Використовуйте для спостереження за спільним ресурсом, не впливаючи на його термін експлуатації, не порушуючи цикли. Цикли із звичайним не повинні відбуватися - два ресурси не можуть володіти один одним.
shared_ptr
weak_ptr
weak_ptr
shared_ptr
Зауважте, що Boost додатково пропонує shared_array
, що може бути підходящою альтернативою shared_ptr<std::vector<T> const>
.
Далі, Boost пропонує intrusive_ptr
полегшене рішення, якщо ваш ресурс вже пропонує довідкову систему управління і ви хочете прийняти його за принципом RAII. Цей стандарт не був прийнятий.
Унікальне право власності:
Boost також має a scoped_ptr
, який не підлягає копіюванню і для якого ви не можете вказати делетер. std::unique_ptr
знаходиться boost::scoped_ptr
на стероїдах і повинен стати вашим вибором за замовчуванням, коли вам потрібен розумний вказівник . Це дозволяє вказати делетер у аргументах шаблону і є рухомим , на відміну від цього boost::scoped_ptr
. Він також повністю використовується в контейнерах STL до тих пір, поки ви не використовуєте операції, для яких потрібні типи, що можна скопіювати (очевидно).
Зауважимо ще раз, що Boost має версію масиву:, scoped_array
що стандарт уніфікований, вимагаючи std::unique_ptr<T[]>
часткової спеціалізації, яка буде delete[]
вказувати замість delete
ing (з 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) забезпечує краще рішення. —Закінчити примітку ]
Немає права власності:
Використовуйте німі вказівники (необроблені вказівники) або посилання для невласників посилань на ресурси, і коли ви знаєте, що ресурс переживе референтний об'єкт / область. Віддайте перевагу посиланням і використовуйте необроблені покажчики, коли вам потрібна ні зведеність, ні перестановка.
Якщо ви хочете невласнити посиланням на ресурс, але ви не знаєте, чи ресурс пережив об’єкт, на який посилається, запакуйте ресурс в a shared_ptr
і використовуйте a weak_ptr
- ви можете перевірити, чи shared_ptr
не живе батько lock
, який буде повернути a, shared_ptr
що не має значення, якщо ресурс все ще існує. Якщо ви хочете перевірити, чи ресурс мертвий, використовуйте expired
. Це може здатися схожим, але сильно відрізняється за умови одночасного виконання, оскільки expired
гарантує лише його повернене значення для цього окремого висловлювання. Начебто невинний тест на кшталт
if(!wptr.expired())
something_assuming_the_resource_is_still_alive();
є потенційною умовою перегонів.