เป็นเจ้าของร่วมกัน:และมาตรฐานที่นำมาจะสวยมากเช่นเดียวกับพวกเขาcounterparts Boost ใช้พวกมันเมื่อคุณต้องการแบ่งปันทรัพยากรและไม่รู้ว่าอันไหนที่จะเป็นคนสุดท้ายที่ยังมีชีวิตอยู่ ใช้เพื่อสังเกตทรัพยากรที่ใช้ร่วมกันโดยไม่มีผลกับอายุการใช้งานของมันและไม่ทำลายวงจร รอบที่ปกติไม่ควรเกิดขึ้น - ทรัพยากรสองรายการไม่สามารถเป็นเจ้าของกันได้
shared_ptr
weak_ptr
weak_ptr
shared_ptr
โปรดทราบว่า Boost นอกจากนี้ข้อเสนอซึ่งอาจจะเป็นทางเลือกที่เหมาะสมกับshared_array
shared_ptr<std::vector<T> const>
ถัดไปเพิ่มข้อเสนอintrusive_ptr
ซึ่งเป็นวิธีการแก้ปัญหาที่มีน้ำหนักเบาหากทรัพยากรของคุณมีการจัดการนับอ้างอิงอยู่แล้วและคุณต้องการปรับใช้กับหลักการ RAII อันนี้ไม่ได้เป็นลูกบุญธรรมตามมาตรฐาน
ความเป็นเจ้าของที่ไม่ซ้ำใคร:
Boost ยังมี a scoped_ptr
ซึ่งไม่สามารถคัดลอกได้และคุณไม่สามารถระบุผู้กำหนดได้ std::unique_ptr
เป็นboost::scoped_ptr
เตียรอยด์และควรจะเลือกเริ่มต้นเมื่อคุณจำเป็นต้องมีตัวชี้สมาร์ท จะช่วยให้คุณระบุ Deleter ในข้อโต้แย้งแม่แบบและเป็นสังหาริมทรัพย์boost::scoped_ptr
ซึ่งแตกต่างจาก นอกจากนี้ยังสามารถใช้งานได้อย่างสมบูรณ์ในคอนเทนเนอร์ STL ตราบใดที่คุณไม่ใช้การดำเนินการที่ต้องการประเภทที่คัดลอกได้ (ชัด)
โปรดทราบอีกครั้งว่า Boost มีรุ่นอาเรย์: scoped_array
ซึ่งมาตรฐานแบบครบวงจรโดยต้องการstd::unique_ptr<T[]>
ความเชี่ยวชาญเฉพาะบางส่วนที่จะdelete[]
เป็นตัวชี้แทนการdelete
อิง (ด้วยdefault_delete
r) std::unique_ptr<T[]>
นอกจากนี้ยังมีoperator[]
แทนและoperator*
operator->
โปรดทราบว่าstd::auto_ptr
ยังอยู่ในมาตรฐาน แต่มันก็เลิก
§D.10 [depr.auto.ptr]
แม่แบบคลาสauto_ptr
เลิกใช้แล้ว [ หมายเหตุ:เทมเพลตคลาสunique_ptr
(20.7.1) มอบวิธีแก้ปัญหาที่ดีกว่า - บันทึกย่อ ]
ไม่มีความเป็นเจ้าของ:
ใช้พอยน์เตอร์พอยน์เตอร์ (พอยน์เตอร์พอยน์เตอร์) หรือการอ้างอิงสำหรับการอ้างอิงที่ไม่ได้เป็นเจ้าของไปยังทรัพยากรและเมื่อคุณรู้ว่าทรัพยากรจะอยู่ได้นานกว่าออบเจ็กต์ / ขอบเขตการอ้างอิง ชอบการอ้างอิงและใช้ตัวชี้แบบ raw เมื่อคุณต้องการความสามารถในการลบล้างหรือความสามารถในการตั้งค่าใหม่
หากคุณต้องการการอ้างอิงที่ไม่ได้เป็นเจ้าของทรัพยากร แต่คุณไม่ทราบว่าทรัพยากรนั้นจะอยู่ได้นานกว่าวัตถุที่อ้างอิงหรือไม่ให้แพ็คทรัพยากรในshared_ptr
และใช้ a weak_ptr
- คุณสามารถทดสอบได้ว่าผู้ปกครองshared_ptr
ยังมีชีวิตอยู่ด้วยlock
หรือไม่ ส่งคืน a shared_ptr
ที่ไม่ใช่ค่า null ถ้าทรัพยากรยังคงมีอยู่ หากต้องการทดสอบว่าทรัพยากรใช้งานexpired
ไม่ได้หรือไม่ ทั้งสองอาจฟังดูคล้ายกัน แต่มีความแตกต่างกันมากในการเผชิญกับการดำเนินการที่เกิดขึ้นพร้อมกันเนื่องจากexpired
รับประกันได้เฉพาะค่าส่งคืนสำหรับคำสั่งเดียว การทดสอบที่ไร้เดียงสาดูเหมือนจะเป็นเช่นนั้น
if(!wptr.expired())
something_assuming_the_resource_is_still_alive();
เป็นสภาพการแข่งขันที่มีศักยภาพ