タグ付けされた質問 「unique-ptr」

std :: unique_ptrは、ポインターを通じてオブジェクトの唯一の所有権を保持するスマートポインターです。unique_ptrはコピー可能でもコピー割り当て可能でもありません。unique_ptrの2つのインスタンスは同じオブジェクトを管理できません。

6
unique_ptr引数をコンストラクタまたは関数に渡すにはどうすればよいですか?
C ++ 11でセマンティクスを移動するのは初めてですがunique_ptr、コンストラクターまたは関数でパラメーターを処理する方法がよくわかりません。このクラスが自分自身を参照していると考えてください。 #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代わりにlineを使用しなければならなかった場合、それは理にかなっています(lineを使用し2ても機能しますが、そうする必要はありません)。 私はC ++ 0xがこの例外を許可していることを知っています。unique_ptr戻り値は関数が終了するとすぐに破棄され、返されるポインターの一意性を保証する一時的なオブジェクトだからです。これがどのように実装されているのか知りたいのですが、コンパイラーで特別なケースになっているのでしょうか、それとも、これが利用する言語仕様に他の節があるのでしょうか?
367 c++  c++11  unique-ptr 

8
Tの完全な定義を知るにはstd :: unique_ptr <T>が必要ですか?
ヘッダーに次のようなコードがあります。 #include &lt;memory&gt; class Thing; class MyClass { std::unique_ptr&lt; Thing &gt; my_thing; }; Thingタイプ定義を含まないcppにこのヘッダーを含めると、VS2010-SP1でコンパイルできません。 1&gt; C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ include \ memory(2067):error C2027:use of undefined type 'Thing' 置き換えstd::unique_ptrによってstd::shared_ptr、それがコンパイルされます。 したがって、std::unique_ptr完全な定義が必要なのは現在のVS2010 の実装であり、完全に実装に依存していると思います。 またはそれは?標準の要件に、std::unique_ptrの実装が前方宣言のみで機能することを不可能にする何かがありますか?へのポインタのみを保持する必要があるため、奇妙に感じThingますね。


2
unique_ptrをベクターにpush_backできないのはなぜですか?
このプログラムの何が問題になっていますか? #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)); 少し冗長。次の方がずっといいと思いませんか? auto p = std::make_unique&lt;SomeUserDefinedType&gt;(1, 2, 3); これはnew見事に非表示になり、タイプについては1回だけ言及します。 とにかく、ここに私の実装の試みがあります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_ptrはの代わりになるはずですstd::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(); // do something with myDevice... } ポインタをスマートポインタに置き換えたいとしましょう。のunique_ptrためにA …

6
std :: unique_ptrメンバーでカスタム削除機能を使用するにはどうすればよいですか?
unique_ptrメンバーを持つクラスがあります。 class Foo { private: std::unique_ptr&lt;Bar&gt; bar; ... }; Barは、create()関数とdestroy()関数を持つサードパーティのクラスです。 std::unique_ptrスタンドアロン関数でwith it を使用したい場合、次のことができます。 void foo() { std::unique_ptr&lt;Bar, void(*)(Bar*)&gt; bar(create(), [](Bar* b){ destroy(b); }); ... } std::unique_ptrクラスのメンバーとしてこれを行う方法はありますか?




7
std :: unique_ptrを関数に渡すにはどうすればよいですか
どうすればstd::unique_ptr関数にを渡すことができますか?次のクラスがあるとしましょう。 class A { public: A(int val) { _val = val; } int GetVal() { return _val; } private: int _val; }; 以下はコンパイルされません。 void MyFunc(unique_ptr&lt;A&gt; arg) { cout &lt;&lt; arg-&gt;GetVal() &lt;&lt; endl; } int main(int argc, char* argv[]) { unique_ptr&lt;A&gt; ptr = unique_ptr&lt;A&gt;(new A(1234)); MyFunc(ptr); return 0; } なぜstd::unique_ptr関数にを渡せないのですか?確かに、これが構成の主な目的ですか?または、C ++委員会は、生のCスタイルのポインターにフォールバックして次のように渡すことを意図していましたか? …
100 c++  c++11  unique-ptr 


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.