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?
cevap
std::unique_ptr
münhasır sahiplik ifade etmek C++ 11 yoldur, ama onun en çekici özelliklerinden biri kolayca ve verimli birstd:: 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 birstd::shared_ptr
'a çevirdikten sonra, fikrinizi değiştirecek bir şey yoktur. Referans sayısı bir olsa bile, birstd::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_ptr
std::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");
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.
İşte "doğru" yol: 'std :: shared_ptr
Ve burada pedantic "doğru" yolu: 'std :: shared_ptr
- 1. C++ 11 kapatma shared_ptr
- 2. C++ 11 std :: shared_ptr + boost :: serileştirme
- 3. C++ 11: GCC 4.8 static thread_local std :: unique_ptr tanımsız başvuru
- 4. C++ statik sınıflar ve shared_ptr bellek sızıntıları
- 5. Neden shared_ptr <A> implicit shared_ptr dosyasına dönüştürebilir <A const>?
- 6. C++ 11
- 7. harita ve shared_ptr serileştirme?
- 8. tr1 arasında paylaşımlar :: shared_ptr ve boost :: shared_ptr?
- 9. Forward declarations ve shared_ptr
- 10. unique_ptr vs shared_ptr'de deleter tipi
- 11. unique_ptr yapıcı
- 12. unique_ptr
- 13. Unique_ptr ve ileri beyan
- 14. ASP.NET Sağlık İzleme ve ELMAH alternatifleri birbirinin mi?
- 15. Reinterpret_cast (veya herhangi bir oyuncu) xvalues'ı lvalues'e dönüştürebilir mi?
- 16. Erişim değerleri C++ 98 ve C++ 11
- 17. std :: shared_ptr ve Kalıtım
- 18. C# C++ 11'de decltype ile eşdeğer mi?
- 19. C++ 11
- 20. std :: unique_ptr
- 21. C++ 11
- 22. MySQL bir literal String ifadesine dönüştürebilir mi?
- 23. Bir unique_ptr değeri nullptr değerine sahip mi?
- 24. boost shared_ptr öğesini void * 'e çevirme ve tersi
- 25. Can iText PDF'yi TIFF görüntülerine dönüştürebilir mi?
- 26. C++ 11 durumsal tümörler, tür sınırlarına göre değiştirilebilir mi? Burada
- 27. -std = C++ 11 ve -std = gnu ++ 11 arasındaki farklar nelerdir?
- 28. En ++ C++ 11 sınıfı C++ 11 referans veya değer olarak
- 29. Temperlenmiş sendikalar C++ 11
- 30. Eşleştirme (C++ 11)
"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
"STL" standart kütüphane anlamına gelmez. STL'nin "shared_ptr" ile ilgisi yoktur. – curiousguy
@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