Apakah pustaka standar C ++ 11 menyediakan utilitas apa pun untuk mengonversi dari a std::shared_ptr
ke 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_ptr
ke std::unique_ptr
, atau sebaliknya? Apakah operasi ini aman?
shared_ptr
.
Jawaban:
std::unique_ptr
adalah 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_ptr
sangat 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_ptr
untukstd::unique_ptr
tidak 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_ptr
mengelolanya.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_ptr
ke std::shared_ptr
tetapi Anda tidak dapat mengkonversi std::shared_ptr
ke 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_ptr
ke 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)};
Deleter
simpanan di dalamunique_ptr