Mu C ++ 11 standart kütüphane bir dönüştürmek için herhangi bir fayda temin std::shared_ptr
etmek std::unique_ptr
, ya da tam tersi? Bu güvenli işlem mi?
shared_ptr
.
Mu C ++ 11 standart kütüphane bir dönüştürmek için herhangi bir fayda temin std::shared_ptr
etmek std::unique_ptr
, ya da tam tersi? Bu güvenli işlem mi?
shared_ptr
.
Yanıtlar:
std::unique_ptr
özel mülkiyeti ifade etmenin C ++ 11 yoludur, ancak en çekici özelliklerinden biri, kolayca ve verimli bir şekildestd::shared_ptr
.Bu,
std::unique_ptr
fabrika işlevi dönüş türü olarak neden bu kadar uygun olduğunun önemli bir parçasıdır . Fabrika işlevleri, arayanların geri döndükleri nesne için özel sahiplik semantiğini kullanmak isteyip istemediklerini veya paylaşılan sahipliğin (yanistd::shared_ptr
) daha uygun olup olmayacağını bilemez .std::unique_ptr
Fabrikalar, bir geri göndererek arayanlara en verimli akıllı işaretçiyi sağlar, ancak arayanların onu daha esnek kardeşiyle değiştirmesini engellemezler.
std::shared_ptr
içinstd::unique_ptr
izin verilmez. Bir kaynağın yaşam boyu yönetimini bir kaynağastd::shared_ptr
dönüştürdüğünüzde, fikrinizi değiştirmezsiniz. Referans sayısı bir olsa bile, örneğin bir yönetime sahip olmak için kaynağın sahipliğini geri alamazsınızstd::unique_ptr
.Referans: Etkili Modern C ++. 42 C ++ 11 VE C ++ 14 KULLANIMINIZI GELİŞTİRMENİN ÖZEL YOLLARI. Scott Meyers.
Kısacası, kolayca ve verimli bir şekilde dönüştürebilir std::unique_ptr
için std::shared_ptr
ancak dönüştürmek olamaz std::shared_ptr
için std::unique_ptr
.
Örneğin:
std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);
veya:
std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
std::unique_ptr
a std::shared_ptr
.
std::unique_ptr
içine a atamasına izin verilmediğini düşündüren nedir std::shared_ptr
? Standart kütüphane bir hareket atama operatörü tanımlar template<class Y, class Deleter> shared_ptr& operator=(std::unique_ptr<Y, Deleter>&& r);
için std::shared_ptr<T>
.
Unique_ptr u_ptr verildiğinde, shared_ptr s_ptr oluşturun:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
Diğer tarafa gitmek pratik değildir.
std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
Deleter
içinde depolananları kaybedebilirsinizunique_ptr