Apakah pustaka standar C ++ 11 menyediakan utilitas apa pun untuk mengonversi dari a std::shared_ptrke std::unique_ptr, atau sebaliknya? Apakah operasi ini aman?
shared_ptr.
Apakah pustaka standar C ++ 11 menyediakan utilitas apa pun untuk mengonversi dari a std::shared_ptrke std::unique_ptr, atau sebaliknya? Apakah operasi ini aman?
shared_ptr.
Jawaban:
std::unique_ptradalah cara C ++ 11 untuk mengekspresikan kepemilikan eksklusif, tetapi salah satu fiturnya yang paling menarik adalah cara ini diubah dengan mudah dan efisien menjadi filestd::shared_ptr.Ini adalah bagian penting mengapa
std::unique_ptrsangat cocok sebagai jenis pengembalian fungsi pabrik. Fungsi pabrik tidak dapat mengetahui apakah pemanggil akan ingin menggunakan semantik kepemilikan eksklusif untuk objek yang mereka kembalikan atau apakah kepemilikan bersama (yaitustd::shared_ptr) akan lebih sesuai. Dengan mengembalikan astd::unique_ptr, pabrik menyediakan penelepon dengan penunjuk cerdas yang paling efisien, tetapi mereka tidak menghalangi penelepon untuk menggantinya dengan saudara kandungnya yang lebih fleksibel.
std::shared_ptruntukstd::unique_ptrtidak diperbolehkan. Setelah Anda mengubah manajemen seumur hidup sumber daya menjadistd::shared_ptr, tidak ada yang berubah pikiran. Meskipun jumlah referensi adalah satu, Anda tidak dapat mengklaim kembali kepemilikan sumber daya untuk, misalnya,std::unique_ptrmengelolanya.Referensi: C ++ Modern Efektif. 42 CARA KHUSUS UNTUK MENINGKATKAN PENGGUNAAN C ++ 11 DAN C ++ 14. Scott Meyers.
Singkatnya, Anda dapat dengan mudah dan efisien mengkonversi std::unique_ptrke std::shared_ptrtetapi Anda tidak dapat mengkonversi std::shared_ptrke std::unique_ptr.
Sebagai contoh:
std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);
atau:
std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
std::unique_ptrke a std::shared_ptr.
Diberikan unique_ptr u_ptr, buat shared_ptr s_ptr:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
Pergi ke arah lain tidak praktis.
std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
Deletersimpanan di dalamunique_ptr