ไม่ C ++ 11 ห้องสมุดมาตรฐานให้ยูทิลิตี้ใด ๆ ที่จะแปลงจากstd::shared_ptr
ไปstd::unique_ptr
หรือกลับกัน? การดำเนินการนี้ปลอดภัยหรือไม่?
shared_ptr
มีอะไรจะทำอย่างไรกับ
ไม่ C ++ 11 ห้องสมุดมาตรฐานให้ยูทิลิตี้ใด ๆ ที่จะแปลงจากstd::shared_ptr
ไปstd::unique_ptr
หรือกลับกัน? การดำเนินการนี้ปลอดภัยหรือไม่?
shared_ptr
มีอะไรจะทำอย่างไรกับ
คำตอบ:
std::unique_ptr
เป็นวิธี C ++ 11 ในการแสดงความเป็นเจ้าของ แต่เพียงผู้เดียว แต่คุณสมบัติที่น่าสนใจที่สุดประการหนึ่งคือการแปลงเป็นไฟล์std::shared_ptr
.นี่เป็นส่วนสำคัญว่าเหตุใด
std::unique_ptr
จึงเหมาะอย่างยิ่งกับประเภทการส่งคืนฟังก์ชันจากโรงงาน ฟังก์ชั่นโรงงานไม่สามารถทราบได้ว่าผู้โทรจะต้องการใช้ความหมายความเป็นเจ้าของเฉพาะตัวสำหรับออบเจ็กต์ที่พวกเขาส่งคืนหรือไม่ว่าการเป็นเจ้าของร่วมกัน (กล่าวคือstd::shared_ptr
) จะเหมาะสมกว่าหรือไม่ ด้วยการส่งคืน astd::unique_ptr
โรงงานจะจัดหาตัวชี้อัจฉริยะที่มีประสิทธิภาพสูงสุดให้กับผู้โทร แต่ก็ไม่ขัดขวางผู้โทรจากการแทนที่ด้วยพี่น้องที่ยืดหยุ่นกว่า
std::shared_ptr
จะstd::unique_ptr
ไม่ได้รับอนุญาต เมื่อคุณเปลี่ยนการจัดการทรัพยากรตลอดชีวิตไปเป็น astd::shared_ptr
แล้วคุณจะไม่เปลี่ยนใจ แม้ว่าจำนวนการอ้างอิงจะเป็นหนึ่ง แต่คุณไม่สามารถอ้างสิทธิ์ความเป็นเจ้าของทรัพยากรเพื่อที่จะกล่าวว่ามีการstd::unique_ptr
จัดการอ้างอิง: C ++ สมัยใหม่ที่มีประสิทธิภาพ 42 วิธีเฉพาะในการปรับปรุงการใช้ C ++ 11 และ C ++ 14 ของคุณ Scott Meyers
ในระยะสั้นที่คุณสามารถได้อย่างง่ายดายและมีประสิทธิภาพแปลงstd::unique_ptr
ไปstd::shared_ptr
แต่คุณไม่สามารถแปลงไปstd::shared_ptr
std::unique_ptr
ตัวอย่างเช่น:
std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);
หรือ:
std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
std::unique_ptr
ให้กับ a std::shared_ptr
.
std::unique_ptr
a std::shared_ptr
? ห้องสมุดมาตรฐานกำหนดผู้ประกอบการที่ได้รับมอบหมายย้าย สำหรับtemplate<class Y, class Deleter> shared_ptr& operator=(std::unique_ptr<Y, Deleter>&& r);
std::shared_ptr<T>
ให้ unique_ptr u_ptr สร้าง shared_ptr s_ptr:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
ไปทางอื่นก็ทำไม่ได้
std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
Deleter
เก็บไว้ในunique_ptr