Чи надає стандартна бібліотека C ++ 11 будь-яку утиліту для перетворення з а std::shared_ptr
в std::unique_ptr
або навпаки? Це безпечна робота?
shared_ptr
.
Чи надає стандартна бібліотека C ++ 11 будь-яку утиліту для перетворення з а std::shared_ptr
в std::unique_ptr
або навпаки? Це безпечна робота?
shared_ptr
.
Відповіді:
std::unique_ptr
це спосіб С ++ 11 виразити ексклюзивне право власності, але однією з найпривабливіших його можливостей є те, що він легко і ефективно перетворюється на astd::shared_ptr
.Це ключова частина того, чому
std::unique_ptr
він так добре підходить як тип повернення заводських функцій. Фабричні функції не можуть знати, чи бажаючі хочуть використовувати ексклюзивну семантику власності для об'єкта, який вони повертають, чиstd::shared_ptr
більш доцільним буде спільне володіння (тобто ). Повертаючи astd::unique_ptr
, фабрики надають абонентам найефективніший інтелектуальний покажчик, але вони не заважають абонентам замінити його на більш гнучкий брат.
std::shared_ptr
доstd::unique_ptr
заборонено. Після того, як ви перетворили управління ресурсом на все життя на astd::shared_ptr
, ви не передумаєте. Навіть якщо кількість посилань одна, ви не можете повернути право власності на ресурс, щоб, скажімо, мати правоstd::unique_ptr
керувати ним.Довідка: Ефективний сучасний C ++. 42 КОНКРЕТНІ СПОСОБИ ПОЛІПШЕННЯ ВАШОГО ВИКОРИСТАННЯ С ++ 11 І С ++ 14. Скотт Майерс.
Коротше кажучи, ви можете легко і ефективно перетворити a std::unique_ptr
на, std::shared_ptr
але не можете перетворити std::shared_ptr
на std::unique_ptr
.
Наприклад:
std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);
або:
std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
std::unique_ptr
a std::shared_ptr
.
Враховуючи унікальний_ptr u_ptr, створіть shared_ptr s_ptr:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
Йти іншим шляхом недоцільно.
std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
Deleter
збережене всерединіunique_ptr