Имеет ли стандартная библиотека C++ 11 любую утилиту для преобразования из std::shared_ptr
в std::unique_ptr
или наоборот? Это безопасная операция?Имеет ли C++ 11 unique_ptr и shared_ptr возможность конвертировать друг в друга?
ответ
std::unique_ptr
является C++ 11 способ выразить исключительное право собственности, но один из его наиболее привлекательных особенностей является то, что она легко и эффективно преобразуется вstd:: shared_ptr
.Это ключевая часть, почему
std::unique_ptr
настолько хорошо подходит как тип возврата заводской функции. Фабричные функции не могут знать, будут ли вызывающие абоненты использовать эксклюзивную семантику собственности для возвращаемого им объекта или будет ли более приемлемым совместное использование (т. Е.std::shared_ptr
). Вернувstd::unique_ptr
, фабрики предоставляют абонентам наиболее эффективный интеллектуальный указатель, но они не мешают абонентам заменить его более гибким братом.
std::shared_ptr
доstd::unique_ptr
не допускается. После того, как вы переработали управление ресурсом доstd::shared_ptr
, вы не передумаете. Даже если счетчик ссылок один, вы не можете вернуть право собственности на ресурс, чтобы, например, управлятьstd::unique_ptr
.Ссылка: Эффективный современный C++. 42 СПЕЦИФИЧЕСКИЕ СПОСОБЫ УЛУЧШЕНИЯ ВАШЕГО ИСПОЛЬЗОВАНИЯ C++ 11 И C++ 14. Скотт Мейерс.
Короче говоря, вы можете легко и эффективно преобразовать 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");
Учитывая unique_ptr u_ptr, создать shared_ptr s_ptr:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
Переход в другую сторону нецелесообразно.
Вот «правильный» способ: 'std :: shared_ptr
И вот педантичный «правильный» способ: 'std :: shared_ptr
Определите, пожалуйста, безопасную операцию. Какую безопасность вы ищете? безопасность жизни? Безопасность резьбы? – jaggedSpire
«STL» не означает стандартную библиотеку. STL не имеет ничего общего с 'shared_ptr'. – curiousguy
@jaggedSpire Безопасность нити означала бы, что у вас есть владельцы, используемые в разных потоках, т. Е. Количество использования не равно 1. – curiousguy