Загальна власність: і стандарт прийнятий в значній мірі так само , як їх буста аналоги . Використовуйте їх, коли вам потрібно поділитися ресурсом, і не знаєте, який з них буде останнім. Використовуйте для спостереження за спільним ресурсом, не впливаючи на його термін експлуатації, не порушуючи цикли. Цикли із звичайним не повинні відбуватися - два ресурси не можуть володіти один одним.
shared_ptrweak_ptrweak_ptrshared_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[]вказувати замість deleteing (з default_deleter). 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();
є потенційною умовою перегонів.