คำถามติดแท็ก smart-pointers

ชนิดข้อมูลนามธรรมที่จำลองตัวชี้ในขณะที่ให้คุณสมบัติเพิ่มเติมเช่นการรวบรวมขยะอัตโนมัติหรือการตรวจสอบขอบเขต

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

2
วิธีส่งคืนตัวชี้อัจฉริยะ (shared_ptr) โดยอ้างอิงหรือตามค่า
สมมติว่าฉันมีคลาสที่มีเมธอดที่ส่งกลับshared_ptr. ประโยชน์ที่เป็นไปได้และข้อเสียของการส่งคืนโดยอ้างอิงหรือตามมูลค่าคืออะไร? เบาะแสที่เป็นไปได้สองประการ: การทำลายวัตถุในช่วงต้น ถ้าฉันส่งคืนการshared_ptrอ้างอิงโดย (const) ตัวนับการอ้างอิงจะไม่เพิ่มขึ้นดังนั้นฉันจึงมีความเสี่ยงที่จะถูกลบวัตถุเมื่อวัตถุนั้นอยู่นอกขอบเขตในบริบทอื่น (เช่นเธรดอื่น) ถูกต้องหรือไม่ จะเกิดอะไรขึ้นถ้าสภาพแวดล้อมเป็นเธรดเดียวสถานการณ์นี้จะเกิดขึ้นได้หรือไม่ ค่าใช้จ่าย Pass-by-value นั้นไม่ฟรีอย่างแน่นอน คุ้มค่าที่จะหลีกเลี่ยงทุกครั้งที่ทำได้หรือไม่? ขอบคุณทุกๆคน.


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ของ …

3
shared_ptr มายากล :)
นายLidströmและฉันมีข้อโต้แย้ง :) คำกล่าวอ้างของMr.Lidströmคือโครงสร้างshared_ptr&lt;Base&gt; p(new Derived);ไม่ต้องการให้ Base มีตัวทำลายเสมือน: Armen Tsirunyan : "จริงเหรอshared_ptr จะล้างข้อมูลอย่างถูกต้องหรือไม่ในกรณีนี้คุณช่วยสาธิตวิธีการใช้เอฟเฟกต์นั้นได้ไหม" Daniel Lidström : " shared_ptrใช้ตัวทำลายของตัวเองเพื่อลบอินสแตนซ์คอนกรีตสิ่งนี้เรียกว่า RAII ในชุมชน C ++ คำแนะนำของฉันคือคุณเรียนรู้ทุกอย่างเกี่ยวกับ RAII มันจะทำให้การเข้ารหัส C ++ ของคุณง่ายขึ้นมากเมื่อคุณใช้ RAII ในทุกสถานการณ์ " Armen Tsirunyan : "ฉันรู้เกี่ยวกับ RAII และฉันก็รู้ด้วยว่าในที่สุดตัวทำลายshared_ptrอาจลบ px ที่เก็บไว้เมื่อ pn ถึง 0 แต่ถ้า px มีตัวชี้ประเภทคงที่Baseและตัวชี้ชนิดไดนามิกเป็นDerivedดังนั้นเว้นแต่จะBaseมีตัวทำลายเสมือน จะส่งผลให้เกิดพฤติกรรมที่ไม่ได้กำหนดแก้ไขฉันถ้าฉันทำผิด " Daniel Lidström : " …

5
มี std :: shared_ptr ที่ไม่ใช่อะตอมหรือไม่ แล้วทำไมไม่มีใน <memory>?
นี่เป็นคำถามสองส่วนเกี่ยวกับปรมาณูของstd::shared_ptr: 1. เท่าที่ฉันสามารถบอกได้std::shared_ptrคือตัวชี้อัจฉริยะเพียงตัวเดียวใน&lt;memory&gt;อะตอมนั้น ฉันสงสัยว่ามีเวอร์ชันที่ไม่ใช่อะตอมหรือไม่std::shared_ptr(ฉันมองไม่เห็นอะไรเลย&lt;memory&gt;ดังนั้นฉันจึงเปิดรับข้อเสนอแนะที่อยู่นอกเหนือจากมาตรฐานเช่นใน Boost) ฉันรู้ว่าboost::shared_ptrเป็นปรมาณู (ถ้าBOOST_SP_DISABLE_THREADSไม่ได้กำหนดไว้) แต่อาจมีทางเลือกอื่น? ฉันกำลังมองหาสิ่งที่มีความหมายเหมือนstd::shared_ptrกัน แต่ไม่มีความเป็นอะตอม 2.ฉันเข้าใจว่าทำไมstd::shared_ptrอะตอม; มันก็ดีนะ อย่างไรก็ตามมันไม่ดีสำหรับทุกสถานการณ์และในอดีต C ++ มีมนต์ตราว่า "จ่ายเฉพาะสิ่งที่คุณใช้เท่านั้น" ถ้าฉันไม่ได้ใช้เธรดหลายเธรดหรือฉันกำลังใช้เธรดหลายเธรด แต่ฉันไม่ได้แชร์ความเป็นเจ้าของพอยน์เตอร์ข้ามเธรดตัวชี้สมาร์ทอะตอมจะมากเกินไป คำถามที่สองของฉันคือเหตุผลที่ไม่ได้เป็นรุ่นที่ไม่ใช่ของอะตอมstd::shared_ptrที่ระบุไว้ใน C ++ 11 ? (สมมติว่ามีสาเหตุ ) (หากคำตอบคือ "เวอร์ชันที่ไม่ใช่อะตอมก็ไม่เคยพิจารณา" หรือ "ไม่เคยมีใครขอเวอร์ชันที่ไม่ใช่อะตอม" ก็ไม่เป็นไร!) สำหรับคำถาม # 2 ฉันสงสัยว่ามีใครเคยเสนอรุ่นที่ไม่ใช่อะตอมของshared_ptr(ไม่ว่าจะเป็น Boost หรือคณะกรรมการมาตรฐาน) (ไม่ใช่เพื่อแทนที่รุ่นอะตอมshared_ptrแต่จะอยู่ร่วมกับมัน) และมันถูกยิงลงสำหรับ เหตุผลเฉพาะ

2
weak_ptr reset ส่งผลต่อ shared_ptr หรือไม่
ฉันไม่ค่อยชินกับการใช้มากนักweak_ptrและฉันกำลังเผชิญกับสถานการณ์ที่ค่อนข้างสับสน ฉันกำลังใช้การอัพเดท Intel XE 2019 นักแต่งเพลง 5 ( แพ็คเกจ 2019.5.281 ) เมื่อรวมกันกับVisual Studio 2019 เวอร์ชั่น 16.2.5 ฉันรวบรวมใน 64 บิต ผมใช้มาตรฐานC ++ 17 นี่คือรหัสสำหรับการแก้ปัญหาขัดขวางของฉัน: #include &lt;memory&gt; #include &lt;iostream&gt; using namespace std; int main( int argc, char* argv[] ) { shared_ptr&lt;int&gt; sp = make_shared&lt;int&gt;( 42 ); cout &lt;&lt; "*sp = " &lt;&lt; …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.