Mu C ++ 11 standart kütüphane bir dönüştürmek için herhangi bir fayda temin std::shared_ptretmek 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_ptretmek 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_ptrfabrika 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_ptrFabrikalar, 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_ptriçinstd::unique_ptrizin verilmez. Bir kaynağın yaşam boyu yönetimini bir kaynağastd::shared_ptrdö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_ptriçin std::shared_ptrancak dönüştürmek olamaz std::shared_ptriç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_ptra std::shared_ptr.
std::unique_ptriç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)};
Deleteriçinde depolananları kaybedebilirsinizunique_ptr