ฉันคิดว่าในขณะที่ฉันเข้าใจ เป้าหมายของ std::observer_ptr ฉันคิดว่ามันจะ จะดีถ้าอย่างน้อยมีตัวเลือกสำหรับประเภทตัวชี้ที่คล้ายกันซึ่งรู้ว่าสิ่งที่ชี้ไปนั้นถูกลบไปแล้วหรือไม่ ตัวอย่างเช่น เราอาจมีสิ่งต่อไปนี้
slightly_smart_ptr<Foo> p1(new Foo());
auto p2 = p1;
p1.erase(); // This deletes the foo referred to by p1.
if (p2.expired())
std::cout << "p2 is expired\n"; // this will fire
วิธีหนึ่งในการบรรลุเป้าหมายนี้ด้วยไลบรารีมาตรฐานปัจจุบันคือ สร้าง shared_ptr เป็น A ในขอบเขตบางอย่างที่จะมีอยู่ตลอดอายุการใช้งานของ A เสมอ อ้างถึง A โดยการส่งอ่อนแอ_ptrs ไปรอบๆ และลบ A เมื่อไม่ต้องการอีกต่อไปโดยการรีเซ็ต shared_ptr อ่อนแอ_ptrs ที่นี่จะมีความหมายพื้นฐานของ observer_ptrs ที่ทราบว่า A ถูกลบไปแล้วหรือไม่ แต่มีปัญหากับแนวทางนี้: จะต้องล็อคอ่อนแอ_ptrs เปลี่ยนให้เป็น shared_ptrs ที่จะใช้ ซึ่งรู้สึกไม่เป็นระเบียบ แต่ที่จริงจังกว่านั้นคือ shared_ptr ถึง A ต้องมีอยู่ที่ไหนสักแห่ง เมื่อผู้ใช้ทุกคนต้องการคือตัวชี้อัจฉริยะเล็กน้อยที่ไม่ได้เป็นเจ้าของ เนื้อหาใด ๆ ผู้ใช้ตกลงที่จะทำลายเนื้อหาด้วยตนเองเมื่อถึงเวลา: ไม่มีการแบ่งปันความเป็นเจ้าของ ดังนั้นจึงเป็นกลิ่นโค้ดสำหรับผู้ใช้ในการสร้าง shared_ptr ในสถานการณ์ดังกล่าว
อย่างไรก็ตาม ฉันไม่สามารถนึกถึงวิธีที่จะซ่อนรายละเอียดของการดำเนินการนี้ได้อย่างมีประสิทธิภาพ
ตัวชี้ดังกล่าวมีอยู่เป็นข้อเสนอหรือในไลบรารีเสริมหรือที่อื่น ๆ หรือไม่?
shared_ptr
และweak_ptr
จริงๆ ไม่ว่าคุณจะออกแบบสิ่งนี้อย่างไร คุณจะต้องล็อควัตถุเพื่อที่พอยน์เตอร์ตัวหนึ่งจะไม่ลบมันในขณะที่อีกอันกำลังใช้งานอยู่ - person super   schedule 16.08.2019if(ptr.valid()) { stuff(); ptr->a; }
ฟังก์ชันstuff()
สามารถทำให้ตัวชี้ใช้ไม่ได้ ดังนั้นคุณต้องตรวจสอบก่อนทุกคำสั่ง - person Guillaume Racicot   schedule 16.08.2019