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

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

17
เมื่อใดที่จะใช้ destructors เสมือนจริง?
ฉันมีความเข้าใจอย่างถ่องแท้เกี่ยวกับทฤษฎี OO ส่วนใหญ่ แต่สิ่งหนึ่งที่ทำให้ฉันสับสนมากคือการทำลายล้างเสมือนจริง ฉันคิดว่า destructor มักถูกเรียกว่าไม่ว่าอะไรและสำหรับทุกวัตถุในโซ่ คุณตั้งใจจะทำให้พวกเขาเป็นเสมือนจริงเมื่อใดและเพราะเหตุใด

8
ความแตกต่างใน make_shared และ shared_ptr ปกติใน C ++
std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); std::shared_ptr<Object> p2(new Object("foo")); Google และ StackOverflow โพสต์หลายคนจะมีเกี่ยวกับเรื่องนี้ แต่ผมไม่สามารถที่จะเข้าใจว่าทำไมจะมีประสิทธิภาพมากกว่าโดยตรงโดยใช้make_sharedshared_ptr ใครช่วยอธิบายฉันทีละขั้นตอนของวัตถุที่สร้างและการดำเนินการโดยทั้งสองเพื่อที่ฉันจะสามารถเข้าใจว่าmake_sharedมีประสิทธิภาพ ฉันได้ยกตัวอย่างหนึ่งตัวอย่างข้างต้นเพื่อการอ้างอิง
276 c++  c++11  shared-ptr 

10
เราควรส่ง shared_ptr โดยอ้างอิงหรือตามค่าหรือไม่
เมื่อฟังก์ชั่นใช้shared_ptr(จากบูสต์หรือ C ++ 11 STL) คุณจะผ่านมัน: โดยอ้างอิง const: void foo(const shared_ptr<T>& p) หรือโดยค่า: void foo(shared_ptr<T> p)? ฉันชอบวิธีแรกเพราะฉันสงสัยว่ามันจะเร็วกว่า แต่สิ่งนี้คุ้มหรือไม่ คุณกรุณาให้เหตุผลในการเลือกของคุณหรือถ้าเป็นเช่นนั้นทำไมคุณคิดว่ามันไม่สำคัญ
270 c++  c++11  boost  shared-ptr 


16
ฉันจะโทร :: std :: make_shared ในคลาสที่มีเพียง constructor ที่ได้รับการป้องกันหรือส่วนตัวได้อย่างไร
ฉันมีรหัสนี้ใช้งานไม่ได้ แต่ฉันคิดว่าเจตนาชัดเจน: testmakeshared.cpp #include <memory> class A { public: static ::std::shared_ptr<A> create() { return ::std::make_shared<A>(); } protected: A() {} A(const A &) = delete; const A &operator =(const A &) = delete; }; ::std::shared_ptr<A> foo() { return A::create(); } แต่ฉันได้รับข้อผิดพลาดนี้เมื่อรวบรวม: g++ -std=c++0x -march=native -mtune=native -O3 -Wall testmakeshared.cpp In file included …
187 c++  c++11  shared-ptr 

2
shared_ptr ไปยังอาร์เรย์: ควรใช้หรือไม่
shared_ptrเพียงแค่การสอบถามเกี่ยวกับการขนาดเล็ก เป็นวิธีปฏิบัติที่ดีที่จะใช้การshared_ptrชี้ไปที่อาร์เรย์หรือไม่ ตัวอย่างเช่น, shared_ptr<int> sp(new int[10]); ถ้าไม่เช่นนั้นทำไมไม่ เหตุผลหนึ่งที่ฉันทำไปแล้วตระหนักถึงความเป็นหนึ่งไม่สามารถเพิ่ม / shared_ptrพร่อง ดังนั้นจึงไม่สามารถใช้งานได้เหมือนตัวชี้ปกติไปยังอาร์เรย์
172 c++  c++11  shared-ptr 

2
การใช้สมาร์ทพอยน์เตอร์สำหรับสมาชิกชั้นเรียน
ฉันมีปัญหาในการทำความเข้าใจการใช้งานตัวชี้อัจฉริยะในฐานะสมาชิกคลาสใน C ++ 11 ฉันได้อ่านพอยน์เตอร์ที่ชาญฉลาดมากและฉันคิดว่าฉันเข้าใจวิธีการunique_ptrและshared_ptr/ หรือweak_ptrทำงานโดยทั่วไป สิ่งที่ฉันไม่เข้าใจคือการใช้งานจริง ดูเหมือนว่าทุกคนแนะนำให้ใช้unique_ptrเป็นวิธีที่จะไปเกือบตลอดเวลา แต่ฉันจะใช้บางสิ่งเช่นนี้ได้อย่างไร: class Device { }; class Settings { Device *device; public: Settings(Device *device) { this->device = device; } Device *getDevice() { return device; } }; int main() { Device *device = new Device(); Settings settings(device); // ... Device *myDevice = settings.getDevice(); // …

6
ทำไมฉันถึงต้อง std :: ย้าย std :: shared_ptr?
ฉันได้อ่านซอร์สโค้ดของ Clangแล้วและฉันพบข้อมูลโค้ดนี้: void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = std::move(Value); } ทำไมฉันจะต้องการที่จะ?std::movestd::shared_ptr มีจุดใดที่ถ่ายโอนความเป็นเจ้าของในทรัพยากรที่ใช้ร่วมกันหรือไม่ ทำไมฉันจะไม่ทำเช่นนี้แทน? void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = Value; }

6
เหตุใด std :: shared_ptr <void> จึงทำงาน
ฉันพบรหัสบางส่วนโดยใช้ std :: shared_ptr เพื่อทำการล้างข้อมูลโดยพลการเมื่อปิดเครื่อง ตอนแรกฉันคิดว่ารหัสนี้อาจใช้งานไม่ได้ แต่ฉันลองทำสิ่งต่อไปนี้: #include &lt;memory&gt; #include &lt;iostream&gt; #include &lt;vector&gt; class test { public: test() { std::cout &lt;&lt; "Test created" &lt;&lt; std::endl; } ~test() { std::cout &lt;&lt; "Test destroyed" &lt;&lt; std::endl; } }; int main() { std::cout &lt;&lt; "At begin of main.\ncreating std::vector&lt;std::shared_ptr&lt;void&gt;&gt;" &lt;&lt; std::endl; std::vector&lt;std::shared_ptr&lt;void&gt;&gt; v; …
129 c++  c++11  shared-ptr 

4
ความแตกต่างระหว่าง `const shared_ptr <T>` และ `shared_ptr <const T>`?
ฉันกำลังเขียนวิธีการเข้าถึงสำหรับตัวชี้ที่ใช้ร่วมกันใน C ++ ซึ่งมีลักษณะดังนี้: class Foo { public: return_type getBar() const { return m_bar; } private: boost::shared_ptr&lt;Bar&gt; m_bar; } ดังนั้นเพื่อรองรับ const-ness ของgetBar()ประเภทการส่งคืนควรเป็นสิ่งboost::shared_ptrที่ป้องกันการแก้ไขที่Barชี้ไป ฉันเดาว่าshared_ptr&lt;const Bar&gt;เป็นประเภทที่ฉันต้องการกลับไปทำเช่นนั้นในขณะที่const shared_ptr&lt;Bar&gt;จะป้องกันไม่ให้การกำหนดตัวชี้ซ้ำเพื่อชี้ไปยังตำแหน่งอื่นBarแต่อนุญาตให้แก้ไขสิ่งBarที่ชี้ไป ... อย่างไรก็ตามฉันไม่แน่ใจ ฉันจะขอบคุณมากถ้ามีคนที่รู้แน่ชัดสามารถยืนยันเรื่องนี้หรือแก้ไขฉันได้หากฉันเข้าใจผิด ขอบคุณ!
116 c++  boost  const  shared-ptr 

17
C ++ - ส่งต่อการอ้างอิงไปยัง std :: shared_ptr หรือ boost :: shared_ptr
ถ้าฉันมีฟังก์ชันที่ต้องทำงานร่วมกับ a shared_ptrมันจะไม่มีประสิทธิภาพมากกว่าที่จะส่งต่อการอ้างอิงไปยังมัน (เพื่อหลีกเลี่ยงการคัดลอกshared_ptrวัตถุ) ผลข้างเคียงที่ไม่ดีที่เป็นไปได้คืออะไร? ฉันนึกภาพสองกรณีที่เป็นไปได้: 1) ภายในฟังก์ชันมีสำเนาของอาร์กิวเมนต์เช่นใน ClassA::take_copy_of_sp(boost::shared_ptr&lt;foo&gt; &amp;sp) { ... m_sp_member=sp; //This will copy the object, incrementing refcount ... } 2) ภายในฟังก์ชันจะใช้อาร์กิวเมนต์เท่านั้นเช่นใน Class::only_work_with_sp(boost::shared_ptr&lt;foo&gt; &amp;sp) //Again, no copy here { ... sp-&gt;do_something(); ... } ฉันไม่เห็นเหตุผลที่ดีในทั้งสองกรณีที่จะส่งผ่านboost::shared_ptr&lt;foo&gt;ค่าโดยแทนที่จะเป็นการอ้างอิง การส่งผ่านตามค่าจะเพิ่มจำนวนอ้างอิง "ชั่วคราว" เนื่องจากการคัดลอกและลดลงเมื่อออกจากขอบเขตฟังก์ชัน ฉันมองข้ามบางสิ่งไปหรือเปล่า? เพียงเพื่อชี้แจงหลังจากอ่านคำตอบหลาย ๆ ข้อ: ฉันเห็นด้วยอย่างสมบูรณ์เกี่ยวกับข้อกังวลเกี่ยวกับการปรับให้เหมาะสมก่อนเวลาอันควรและฉันมักจะพยายามสร้างจุดเริ่มต้นจากนั้นทำงานบนฮอตสปอต คำถามของฉันมาจากมุมมองของโค้ดทางเทคนิคล้วนๆถ้าคุณรู้ว่าฉันหมายถึงอะไร

2
C ++ 11 unique_ptr และ shared_ptr สามารถแปลงเป็นประเภทของกันและกันได้หรือไม่?
ไม่ C ++ 11 ห้องสมุดมาตรฐานให้ยูทิลิตี้ใด ๆ ที่จะแปลงจากstd::shared_ptrไปstd::unique_ptrหรือกลับกัน? การดำเนินการนี้ปลอดภัยหรือไม่?

3
std :: shared_ptr เธรดปลอดภัยอธิบาย
ฉันกำลังอ่านhttp://gcc.gnu.org/onlinedocs/libstdc++/manual/shared_ptr.htmlและปัญหาด้านความปลอดภัยของเธรดยังไม่ชัดเจนสำหรับฉัน: มาตรฐานรับประกันว่าการนับอ้างอิงได้รับการจัดการเธรดอย่างปลอดภัยและเป็นอิสระจากแพลตฟอร์มใช่ไหม ปัญหาที่คล้ายกัน - มาตรฐานรับประกันว่าเธรดเดียวเท่านั้น (ถือการอ้างอิงสุดท้าย) จะเรียกลบในวัตถุที่แชร์ใช่ไหม shared_ptr ไม่รับประกันความปลอดภัยของเธรดใด ๆ สำหรับอ็อบเจ็กต์ที่เก็บอยู่ในนั้น? แก้ไข: รหัสหลอก: // Thread I shared_ptr&lt;A&gt; a (new A (1)); // Thread II shared_ptr&lt;A&gt; b (a); // Thread III shared_ptr&lt;A&gt; c (a); // Thread IV shared_ptr&lt;A&gt; d (a); d.reset (new A (10)); การเรียกการรีเซ็ต () ในเธรด IV จะลบอินสแตนซ์ก่อนหน้าของคลาส A ที่สร้างในเธรดแรกและแทนที่ด้วยอินสแตนซ์ใหม่? …
106 c++  c++11  shared-ptr 

2
std :: shared_ptr ของสิ่งนี้
ขณะนี้ฉันกำลังพยายามเรียนรู้วิธีใช้ตัวชี้อัจฉริยะ อย่างไรก็ตามในขณะที่ทำการทดลองบางอย่างฉันพบสถานการณ์ต่อไปนี้ซึ่งฉันไม่สามารถหาวิธีแก้ปัญหาที่น่าพอใจได้: สมมติว่าคุณมีวัตถุของคลาส A เป็นผู้ปกครองของวัตถุคลาส B (เด็ก) แต่ทั้งสองควรรู้จักกัน: class A; class B; class A { public: void addChild(std::shared_ptr&lt;B&gt; child) { children-&gt;push_back(child); // How to do pass the pointer correctly? // child-&gt;setParent(this); // wrong // ^^^^ } private: std::list&lt;std::shared_ptr&lt;B&gt;&gt; children; }; class B { public: setParent(std::shared_ptr&lt;A&gt; parent) { this-&gt;parent = parent; …

4
shared_ptr อยู่ที่ไหน
ตอนนี้ฉันรู้สึกหงุดหงิดมากหลังจากพยายามหาที่ตั้งของ shared_ptr อยู่หลายชั่วโมง ไม่มีตัวอย่างใดที่ฉันเห็นแสดงโค้ดที่สมบูรณ์เพื่อรวมส่วนหัวสำหรับshared_ptr(และใช้งานได้) เพียงแค่ระบุstd, tr1และ&lt;memory&gt;ไม่ได้ช่วยที่ทุกคน! ฉันดาวน์โหลดบูสต์แล้ว แต่ก็ยังไม่ปรากฏ! ใครช่วยบอกทีว่าหาได้ที่ไหน ขอบคุณที่ให้ฉันระบายความผิดหวัง! แก้ไข: ฉันเห็นว่าชื่อของฉันเปลี่ยนไป ขอโทษด้วยกับเรื่องนั้น. ดังนั้น ... มันยังเป็นเพราะฉันไม่ชัดเจนว่า shared_ptr "ขึ้นอยู่กับเวอร์ชัน C ++" -&gt; นั่นเป็นสาเหตุที่ฉันไม่ระบุสภาพแวดล้อมของฉัน -&gt; ดังนั้นจึงเป็นเรื่องยากสำหรับฉันที่จะค้นหามัน ฉันกำลังทำงานกับ MSVS2008 แก้ไข 2: ฉันไม่รู้ว่าทำไม แต่ฉันรวม [memory] และ [boost / tr1 / memory.hpp] และ [boost / tr1 / tr1 / memory] ในขณะที่มองหา shared_ptr ทุกที่ .. แน่นอนฉันทำไม่ได้ …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.