2016-06-17 17 views
23

C++ 11 standart kitaplığı std::shared_ptr'dan std::unique_ptr'a dönüştürmek için herhangi bir yardımcı program mı, yoksa tam tersi mi? Bu güvenli operasyon mu?C++ 11 unique_ptr ve shared_ptr birbirinin türüne dönüştürebilir mi?

+0

"Güvenli çalışma" tanımlayın lütfen. Ne tür bir güvenlik arıyorsun? ömür boyu yönetim güvenliği? İplik güvenliği? – jaggedSpire

+0

"STL" standart kütüphane anlamına gelmez. STL'nin "shared_ptr" ile ilgisi yoktur. – curiousguy

+0

@jaggedSpire İş güvenliği, sahiplerin farklı iş parçacıklarında sahip olduğunuz anlamına gelir, yani kullanım sayısı 1 değildir. – curiousguy

cevap

36

std::unique_ptr münhasır sahiplik ifade etmek C++ 11 yoldur, ama onun en çekici özelliklerinden biri kolayca ve verimli bir std:: shared_ptr dönüşür olmasıdır.

Bu, std::unique_ptr'un neden fabrika işlevi dönüş türü olarak çok uygun olduğunun önemli bir parçasıdır. Fabrika işlevleri, arayanların döndürdükleri nesne için özel sahiplik semantiklerini kullanmak isteyip istemediklerini veya paylaşılan sahipliğin (yani, std::shared_ptr) daha uygun olup olmayacağını bilmez. Fabrikalar, std::unique_ptr numaralı telefonu iade ederek, arayanlara en verimli akıllı göstericiyi sunar, ancak arayanlar daha esnek kardeşi ile değiştirmelerini engellemez.

std::shared_ptr - std::unique_ptr izin verilmez. Bir kaynağın ömür boyu yönetimini bir std::shared_ptr'a çevirdikten sonra, fikrinizi değiştirecek bir şey yoktur. Referans sayısı bir olsa bile, bir std::unique_ptr ürününü yönetmek için kaynağın sahipliğini geri alamazsınız.

Referans: Etkili Modern C++. 42 C++ 11 VE C++ KULLANIMINIZI GELİŞTİRMEK İÇİN ÖZEL ŞEKİL 14. Scott Meyers. Kısacası

, kolay ve verimli bir bir std::unique_ptrstd::shared_ptr dönüşebilen fakat std::unique_ptr için std::shared_ptr dönüştüremezsiniz. Örneğin

:

std::unique_ptr<std::string> unique = std::make_unique<std::string>("test"); 
std::shared_ptr<std::string> shared = std::move(unique); 

ya:

std::shared_ptr<std::string> shared = std::make_unique<std::string>("test"); 
+5

... Bunu nasıl yapıyorsunuz? – Jake

+1

@Jake Bir örnek ekledim – chema989

0

Verilen unique_ptr u_ptr, Shared_ptr s_ptr oluşturun:

std::shared_ptr<whatever> s_ptr(u_ptr.release()); 

başka bir yol gidiyor pratik değildir.

+13

İşte "doğru" yol: 'std :: shared_ptr s_ptr (std :: move (u_ptr));' – emlai

+0

Ve burada pedantic "doğru" yolu: 'std :: shared_ptr s_ptr {std :: move (u_ptr)}; ' – polyvertex