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

std :: unique_ptr เป็นสมาร์ทพอยน์เตอร์ที่รักษาความเป็นเจ้าของอ็อบเจ็กต์ แต่เพียงผู้เดียวผ่านตัวชี้ unique_ptr ไม่สามารถคัดลอกหรือกำหนดสำเนาได้ unique_ptr สองอินสแตนซ์ไม่สามารถจัดการอ็อบเจ็กต์เดียวกันได้

6
ฉันจะส่งผ่านอาร์กิวเมนต์ unique_ptr ไปยังตัวสร้างหรือฟังก์ชันได้อย่างไร
ฉันใหม่เพื่อย้ายซีแมนทิกส์ใน C ++ 11 และฉันไม่รู้วิธีจัดการunique_ptrพารามิเตอร์ใน Constructor หรือฟังก์ชั่น พิจารณาคลาสนี้อ้างอิง: #include <memory> class Base { public: typedef unique_ptr<Base> UPtr; Base(){} Base(Base::UPtr n):next(std::move(n)){} virtual ~Base(){} void setNext(Base::UPtr n) { next = std::move(n); } protected : Base::UPtr next; }; นี่เป็นวิธีที่ฉันควรจะเขียนฟังก์ชั่นการunique_ptrโต้แย้ง? และฉันต้องใช้std::moveในรหัสโทรหรือไม่ Base::UPtr b1; Base::UPtr b2(new Base()); b1->setNext(b2); //should I write b1->setNext(std::move(b2)); instead?

5
ส่งคืน unique_ptr จากฟังก์ชั่น
unique_ptr<T>ไม่อนุญาตการสร้างสำเนา แต่จะรองรับซีแมนทิกส์ของการย้าย แต่ฉันสามารถคืนค่าunique_ptr<T>จากฟังก์ชันและกำหนดค่าที่ส่งคืนให้กับตัวแปรได้ #include <iostream> #include <memory> using namespace std; unique_ptr<int> foo() { unique_ptr<int> p( new int(10) ); return p; // 1 //return move( p ); // 2 } int main() { unique_ptr<int> p = foo(); cout << *p << endl; return 0; } รหัสข้างต้นรวบรวมและทำงานตามที่ตั้งใจไว้ ดังนั้นบรรทัด1นั้นจะไม่เรียกใช้ตัวสร้างการคัดลอกและทำให้เกิดข้อผิดพลาดของคอมไพเลอร์อย่างไร ถ้าฉันต้องใช้ไลน์2แทนมันก็สมเหตุสมผลดี (การใช้2งานไลน์ก็เช่นกัน แต่เราไม่จำเป็นต้องทำเช่นนั้น) ฉันรู้ว่า …
367 c++  c++11  unique-ptr 

8
จำเป็นต้องใช้ std :: unique_ptr <T> เพื่อทราบความหมายแบบเต็มของ T หรือไม่?
ฉันมีรหัสในส่วนหัวที่มีลักษณะเช่นนี้: #include &lt;memory&gt; class Thing; class MyClass { std::unique_ptr&lt; Thing &gt; my_thing; }; ถ้าฉันรวมส่วนหัวนี้ใน cpp ที่ไม่ได้มีการThingกำหนดประเภทแล้วนี่ไม่ได้รวบรวมภายใต้ VS2010-SP1: 1&gt; ไฟล์ C: \ Program (x86) \ Microsoft Visual Studio 10.0 \ VC \ include \ memory (2067): ข้อผิดพลาด C2027: การใช้ประเภท 'สิ่งที่ไม่ได้กำหนด' แทนที่std::unique_ptrด้วยstd::shared_ptrและมันจะรวบรวม ดังนั้นฉันเดาว่านี่เป็นการนำไปใช้ของ VS2010 ในปัจจุบันstd::unique_ptrซึ่งต้องการคำจำกัดความเต็มรูปแบบและขึ้นอยู่กับการนำไปใช้โดยสิ้นเชิง หรือมันคืออะไร? มีบางสิ่งในข้อกำหนดมาตรฐานที่ทำให้เป็นไปไม่ได้std::unique_ptrที่การนำไปใช้เพื่อทำงานกับการประกาศล่วงหน้าเท่านั้น มันรู้สึกแปลกที่ควรถือพอยน์เตอร์ไว้เท่านั้นThingไม่ใช่เหรอ?

17
มีการใช้งาน unique_ptr กับอาเรย์ไหม?
std::unique_ptr มีการสนับสนุนสำหรับอาร์เรย์ตัวอย่างเช่น: std::unique_ptr&lt;int[]&gt; p(new int[10]); แต่มันจำเป็นหรือไม่ อาจจะมีความสะดวกมากขึ้นในการใช้หรือstd::vectorstd::array คุณพบว่ามีประโยชน์สำหรับการสร้างที่?

2
ทำไมฉันไม่สามารถผลักดัน unique_ptr ไปยังเวกเตอร์ได้
เกิดอะไรขึ้นกับโปรแกรมนี้ #include &lt;memory&gt; #include &lt;vector&gt; int main() { std::vector&lt;std::unique_ptr&lt;int&gt;&gt; vec; int x(1); std::unique_ptr&lt;int&gt; ptr2x(&amp;x); vec.push_back(ptr2x); //This tiny command has a vicious error. return 0; } ข้อผิดพลาด: In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/mingw32/bits/c++allocator.h:34:0, from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/allocator.h:48, from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/memory:64, from main.cpp:6: c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/unique_ptr.h: In member function 'void __gnu_cxx::new_allocator&lt;_Tp&gt;::construct(_Tp*, const _Tp&amp;) [with _Tp = std::unique_ptr&lt;int&gt;, _Tp* …

6
make_unique และการส่งต่อที่สมบูรณ์แบบ
เหตุใดจึงไม่มีstd::make_uniqueเทมเพลตฟังก์ชันในไลบรารี C ++ 11 มาตรฐาน ฉันหา std::unique_ptr&lt;SomeUserDefinedType&gt; p(new SomeUserDefinedType(1, 2, 3)); verbose เล็กน้อย ต่อไปนี้จะดีกว่านี้ไหม auto p = std::make_unique&lt;SomeUserDefinedType&gt;(1, 2, 3); สิ่งนี้ซ่อนสิ่งที่newดีและกล่าวถึงเพียงครั้งเดียวเท่านั้น อย่างไรก็ตามนี่คือความพยายามของฉันในการดำเนินการmake_unique: template&lt;typename T, typename... Args&gt; std::unique_ptr&lt;T&gt; make_unique(Args&amp;&amp;... args) { return std::unique_ptr&lt;T&gt;(new T(std::forward&lt;Args&gt;(args)...)); } ฉันใช้เวลาพอสมควรในการstd::forwardรวบรวมสิ่งต่าง ๆ แต่ฉันไม่แน่ใจว่ามันถูกต้องหรือไม่ ใช่ไหม? std::forward&lt;Args&gt;(args)...หมายความว่าอะไรกันแน่? คอมไพเลอร์ทำอะไรได้บ้าง

6
std :: unique_ptr ด้วยประเภทที่ไม่สมบูรณ์จะไม่รวบรวม
ฉันใช้ pimpl-idiom กับstd::unique_ptr: class window { window(const rectangle&amp; rect); private: class window_impl; // defined elsewhere std::unique_ptr&lt;window_impl&gt; impl_; // won't compile }; อย่างไรก็ตามฉันได้รับข้อผิดพลาดในการคอมไพล์เกี่ยวกับการใช้ประเภทที่ไม่สมบูรณ์ในบรรทัด 304 ใน&lt;memory&gt;: แอปพลิเคชันไม่ถูกต้องของ ' sizeof' เป็นประเภทไม่สมบูรณ์ ' uixx::window::window_impl' เท่าที่ฉันรู้std::unique_ptrควรใช้กับประเภทที่ไม่สมบูรณ์ นี่เป็นข้อบกพร่องใน libc ++ หรือฉันทำอะไรผิดที่นี่?

4
std :: auto_ptr ถึง std :: unique_ptr
กับมาตรฐานใหม่ที่มา (และชิ้นส่วนอยู่แล้วในบางคอมไพเลอร์) รูปแบบใหม่ควรจะเป็นแทน std::unique_ptrstd::auto_ptr การใช้งานของพวกเขาทับซ้อนกันหรือไม่ (เพื่อให้ฉันสามารถค้นหา / แทนที่ทั่วโลกบนโค้ดของฉัน (ไม่ใช่ว่าฉันจะทำสิ่งนี้ แต่ถ้าฉันทำ)) หรือฉันควรตระหนักถึงความแตกต่างที่ไม่ชัดเจนจากการอ่านเอกสาร? นอกจากนี้ถ้ามันเป็นแทนโดยตรงทำไมให้มันชื่อใหม่มากกว่าแค่การปรับปรุงstd::auto_ptr?

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

6
ฉันจะใช้ deleter ที่กำหนดเองกับสมาชิก std :: unique_ptr ได้อย่างไร
ฉันมีชั้นเรียนที่มีสมาชิก unique_ptr class Foo { private: std::unique_ptr&lt;Bar&gt; bar; ... }; Bar เป็นคลาสของบุคคลที่สามที่มีฟังก์ชัน create () และฟังก์ชัน destroy () หากฉันต้องการใช้ a std::unique_ptrร่วมกับมันในฟังก์ชันสแตนด์อโลนฉันสามารถทำได้: void foo() { std::unique_ptr&lt;Bar, void(*)(Bar*)&gt; bar(create(), [](Bar* b){ destroy(b); }); ... } มีวิธีดำเนินการในstd::unique_ptrฐานะสมาชิกของชั้นเรียนหรือไม่?

4
ความแตกต่างระหว่าง std :: make_unique และ std :: unique_ptr กับ new
ไม่std::make_uniqueได้มีผลประโยชน์ใด ๆ เช่นประสิทธิภาพstd::make_shared? เมื่อเทียบกับการสร้างด้วยตนเองstd::unique_ptr: std::make_unique&lt;int&gt;(1); // vs std::unique_ptr&lt;int&gt;(new int(1));

2
C ++ 11 unique_ptr และ shared_ptr สามารถแปลงเป็นประเภทของกันและกันได้หรือไม่?
ไม่ C ++ 11 ห้องสมุดมาตรฐานให้ยูทิลิตี้ใด ๆ ที่จะแปลงจากstd::shared_ptrไปstd::unique_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;

6
เหตุใดจึงต้องใช้ std :: make_unique ใน C ++ 17
เท่าที่ฉันเข้าใจ C ++ 14 แนะนำstd::make_uniqueเนื่องจากไม่ได้ระบุลำดับการประเมินพารามิเตอร์สิ่งนี้ไม่ปลอดภัย: f(std::unique_ptr&lt;MyClass&gt;(new MyClass(param)), g()); // Syntax A (คำอธิบาย: หากการประเมินจัดสรรหน่วยความจำให้กับตัวชี้ดิบเป็นอันดับแรกการเรียกใช้g()และข้อยกเว้นจะเกิดขึ้นก่อนการstd::unique_ptrสร้างหน่วยความจำจะรั่วไหล) การโทรstd::make_uniqueเป็นวิธีการ จำกัด ลำดับการโทรซึ่งทำให้สิ่งต่างๆปลอดภัย: f(std::make_unique&lt;MyClass&gt;(param), g()); // Syntax B ตั้งแต่นั้นมา, C ++ 17 ได้ชี้แจงเพื่อการประเมินผลที่ทำให้ไวยากรณ์ปลอดภัยเกินไปดังนั้นนี่คือคำถามของฉัน: คือยังคงมีเหตุผลที่จะใช้std::make_uniqueมากกว่าstd::unique_ptr's constructor ใน C ++ 17? คุณสามารถยกตัวอย่างได้หรือไม่? ณ ตอนนี้เหตุผลเดียวที่ฉันนึกได้คืออนุญาตให้พิมพ์ได้MyClassเพียงครั้งเดียว (สมมติว่าคุณไม่จำเป็นต้องพึ่งพาความหลากหลายด้วยstd::unique_ptr&lt;Base&gt;(new Derived(param))) อย่างไรก็ตามนั่นดูเหมือนเป็นเหตุผลที่ค่อนข้างอ่อนแอโดยเฉพาะอย่างยิ่งเมื่อstd::make_uniqueไม่อนุญาตให้ระบุ deleter ในขณะที่ตัวstd::unique_ptrสร้างทำ และเพื่อความชัดเจนฉันไม่สนับสนุนให้ลบออกstd::make_uniqueจาก Standard Library (อย่างน้อยก็เหมาะสมสำหรับความเข้ากันได้แบบย้อนหลัง) แต่ค่อนข้างสงสัยว่ายังมีสถานการณ์ที่ต้องการอย่างยิ่งstd::unique_ptr
98 c++  c++17  unique-ptr 

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