คำถามติดแท็ก shared-ptr

การอ้างอิงนับคลาสตัวชี้อัจฉริยะที่ใช้การเป็นเจ้าของร่วมกัน

2
เหตุใด shared_ptr <void> ถูกกฎหมายในขณะที่ unique_ptr <void> มีรูปแบบไม่ถูกต้อง
คำถามนี้เหมาะกับชื่อจริงๆ: ฉันอยากรู้ว่าอะไรคือเหตุผลทางเทคนิคสำหรับความแตกต่างนี้ แต่ยังมีเหตุผลด้วย? std::shared_ptr&lt;void&gt; sharedToVoid; // legal; std::unique_ptr&lt;void&gt; uniqueToVoid; // ill-formed;

4
ส่ง shared_ptr <Derived> เป็น shared_ptr <Base>
วิธีใดที่ดีที่สุดในการส่งผ่านshared_ptrประเภทที่ได้รับไปยังฟังก์ชันที่ใช้shared_ptrประเภทฐาน โดยทั่วไปฉันส่งผ่านshared_ptrs โดยการอ้างอิงเพื่อหลีกเลี่ยงสำเนาที่ไม่จำเป็น: int foo(const shared_ptr&lt;bar&gt;&amp; ptr); แต่จะไม่ได้ผลถ้าฉันพยายามทำสิ่งที่ชอบ int foo(const shared_ptr&lt;Base&gt;&amp; ptr); ... shared_ptr&lt;Derived&gt; bar = make_shared&lt;Derived&gt;(); foo(bar); ฉันสามารถใช้ foo(dynamic_pointer_cast&lt;Base, Derived&gt;(bar)); แต่ดูเหมือนว่าจะไม่เหมาะสมด้วยเหตุผลสองประการ: dynamic_castดูเหมือนว่าบิตมากเกินไปสำหรับการที่เรียบง่ายที่ได้รับการหล่อฐาน ตามที่ฉันเข้าใจdynamic_pointer_castสร้างสำเนา (แม้ว่าจะเป็นเพียงชั่วคราว) ของตัวชี้เพื่อส่งผ่านไปยังฟังก์ชัน มีทางออกที่ดีกว่านี้หรือไม่? อัปเดตสำหรับลูกหลาน: มันกลายเป็นปัญหาของไฟล์ส่วนหัวที่หายไป นอกจากนี้สิ่งที่ฉันพยายามทำต่อไปนี้ถือเป็นปฏิปักษ์ โดยทั่วไปแล้ว ฟังก์ชั่นที่ไม่ได้ส่งผลกระทบต่อชีวิตของวัตถุ (เช่นวัตถุที่ยังคงถูกต้องสำหรับระยะเวลาของฟังก์ชั่น) int foo(bar&amp; b)ควรจะใช้การอ้างอิงธรรมดาหรือตัวชี้เช่น ฟังก์ชั่นที่ใช้วัตถุ (เช่นเป็นผู้ใช้ขั้นสุดท้ายของวัตถุที่กำหนด) ควรใช้โดยค่าเช่นunique_ptr int foo(unique_ptr&lt;bar&gt; b)ผู้โทรควรstd::moveใส่ค่าลงในฟังก์ชัน ฟังก์ชั่นที่ขยายอายุการใช้งานของวัตถุควรใช้โดยค่าเช่นshared_ptr int foo(shared_ptr&lt;bar&gt; b)คำแนะนำตามปกติเพื่อหลีกเลี่ยงการอ้างอิงแบบวงกลมใช้ ดูรายละเอียดเกี่ยวกับ Back to Basicsของ …

5
การส่งพอยน์เตอร์ที่ใช้ร่วมกันเป็นอาร์กิวเมนต์
ถ้าฉันประกาศว่าวัตถุที่อยู่ในตัวชี้ที่ใช้ร่วมกัน: std::shared_ptr&lt;myClass&gt; myClassObject(new myClass()); จากนั้นฉันต้องการส่งต่อเป็นอาร์กิวเมนต์ให้กับวิธีการ: DoSomething(myClassObject); //the called method void DoSomething(std::shared_ptr&lt;myClass&gt; arg1) { arg1-&gt;someField = 4; } ข้างต้นเพียงแค่เพิ่มจำนวนการอ้างอิงของ shared_pt และทุกอย่างจะดี? หรือไม่ทิ้งตัวชี้ห้อย? คุณยังควรทำสิ่งนี้หรือไม่: DoSomething(myClassObject.Get()); void DoSomething(std::shared_ptr&lt;myClass&gt;* arg1) { (*arg1)-&gt;someField = 4; } ฉันคิดว่าวิธีที่ 2 อาจมีประสิทธิภาพมากกว่าเพราะต้องคัดลอกที่อยู่ 1 รายการเท่านั้น (ตรงข้ามกับตัวชี้อัจฉริยะทั้งหมด) แต่วิธีที่ 1 ดูเหมือนจะอ่านได้มากกว่าและฉันไม่คาดว่าจะมีการ จำกัด ประสิทธิภาพการทำงาน ฉันแค่อยากให้แน่ใจว่าไม่มีอะไรอันตรายเกี่ยวกับเรื่องนี้ ขอขอบคุณ.

3
deleter ของ shared_ptr ถูกเก็บไว้ในหน่วยความจำที่จัดสรรโดยตัวจัดสรรที่กำหนดเองหรือไม่
บอกว่าผมมีshared_ptrกับการจัดสรรที่กำหนดเองและ Deleter ที่กำหนดเอง ฉันไม่สามารถหาอะไรในมาตรฐานที่พูดถึงว่าควรเก็บ deleter ที่ไหน: ไม่ได้บอกว่าตัวจัดสรรแบบกำหนดเองจะถูกใช้สำหรับหน่วยความจำของ deleter และมันไม่ได้บอกว่ามันจะไม่เป็นเช่นนั้น สิ่งนี้ไม่ได้ระบุหรือฉันเพิ่งจะพลาดบางสิ่ง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.