ไม่ 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_ptrstd::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_ptra 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