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

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

6
C ++ 17でstd :: make_uniqueを使用する理由
私が理解している限りでは、C ++ 14が導入さstd::make_uniqueれたのは、パラメーターの評価順序が指定されなかった結果、これが安全ではなかったためです。 f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A (説明:評価が最初にrawポインターにメモリを割り当て、次に呼び出しをg()行い、std::unique_ptr構築前に例外がスローされた場合、メモリがリークします。) 呼び出しstd::make_uniqueは呼び出し順序を制限する方法であり、これにより物事が安全になります。 f(std::make_unique<MyClass>(param), g()); // Syntax B それ以来、C ++ 17があまりにも構文Aの安全を作り、評価順序を明らかにしたので、ここで私の質問です:まだ使用する理由であるstd::make_unique以上std::unique_ptrの++ 17 Cでコンストラクタを?いくつか例を挙げていただけますか? 今のところ、私が想像できる唯一の理由は、それがMyClass一度だけタイプできることです(あなたがでポリモーフィズムに依存する必要がないと仮定するとstd::unique_ptr<Base>(new Derived(param)))。しかし、それはかなり弱い理由のようです、特にstd::make_uniqueがstd::unique_ptrコンストラクターを使用している削除者を指定できないです。 そして明確にするために、私はstd::make_unique標準ライブラリから削除することを支持することはしません(少なくとも後方互換性のためにそれを維持することは推奨しません)。std::unique_ptr
96 c++  c++17  unique-ptr 

4
std :: unique_ptrを宣言する方法とその用途は何ですか?
私はどのようにstd::unique_ptr機能するかを理解しようとし、そのためにこのドキュメントを見つけました。著者は次の例から始めます。 #include <utility> //declarations of unique_ptr using std::unique_ptr; // default construction unique_ptr<int> up; //creates an empty object // initialize with an argument unique_ptr<int> uptr (new int(3)); double *pd= new double; unique_ptr<double> uptr2 (pd); // overloaded * and -> *uptr2 = 23.5; unique_ptr<std::string> ups (new std::string("hello")); int len=ups->size(); 私を混乱させているのは、この行にあることです unique_ptr<int> uptr …
95 c++  pointers  std  unique-ptr 

6
error :: make_uniqueは「std」のメンバーではありません
コードレビューに投稿された次のスレッドプールプログラムをコンパイルしてテストしようとしています。 /codereview/55100/platform-independant-thread-pool-v4 しかし、私はエラーが発生しています threadpool.hpp: In member function ‘std::future<decltype (task((forward<Args>)(args)...))> threadpool::enqueue_task(Func&&, Args&& ...)’: threadpool.hpp:94:28: error: ‘make_unique’ was not declared in this scope auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>> (std::move(bound_task), std::move(promise)); ^ threadpool.hpp:94:81: error: expected primary-expression before ‘>’ token auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>>(std::move(bound_task), std::move(promise)); ^ main.cpp: In function ‘int main()’: main.cpp:9:17: error: …

4
T *をレジスタに渡すことができるのに、unique_ptr <T>はできないのはなぜですか?
私はCppCon 2019でチャンドラー・カルースの講演を見ています: ゼロコストの抽象化はありません その中で、彼は、std::unique_ptr&lt;int&gt;over を使用することによって生じるオーバーヘッドの大きさに驚いた様子の例を示していint*ます。そのセグメントは、およそ17:25の時点で始まります。 彼のサンプルのスニペットのペア(godbolt.org)のコンパイル結果を確認できます。実際、コンパイラーがunique_ptr値を渡そうとはしていないようです。ただのアドレス-レジスタ内、ストレートメモリ内のみ。 Carruth氏が27:00頃に指摘する点の1つは、C ++ ABIが値渡しパラメーター(すべてではないが、一部ではない可能性があります。レジスター内ではなく。 私の質問: これは実際には一部のプラットフォームでのABI要件ですか?(どれですか?)または、特定のシナリオでの悲観化に過ぎないのでしょうか? なぜABIはそのようなのですか?つまり、構造体/クラスのフィールドがレジスター内、または単一のレジスター内に収まる場合、なぜそのレジスター内で渡すことができないのでしょうか? C ++標準委員会は、この点について近年、またはこれまでに議論しましたか? PS-この質問をコードなしで残さないように: 単純なポインタ: void bar(int* ptr) noexcept; void baz(int* ptr) noexcept; void foo(int* ptr) noexcept { if (*ptr &gt; 42) { bar(ptr); *ptr = 42; } baz(ptr); } 一意のポインタ: using std::unique_ptr; void bar(int* ptr) noexcept; void baz(unique_ptr&lt;int&gt; …

4
std :: unique_ptrを渡す方法は?
私はC ++ 11を使用する最初の試みをしていunique_ptrます。1つのクラスが所有しているが、頻繁に渡される私のプロジェクト内のポリモーフィックなrawポインターを置き換えています。 以前は次のような機能がありました。 bool func(BaseClass* ptr, int other_arg) { bool val; // plain ordinary function that does something... return val; } しかし、私はすぐに私が切り替えることができないことに気づきました: bool func(std::unique_ptr&lt;BaseClass&gt; ptr, int other_arg); 呼び出し元は関数へのポインターの所有権を処理する必要があるため、私はしたくありません。だから、私の問題に対する最善の解決策は何ですか? 私は次のように、参照としてポインタを渡すことを考えました: bool func(const std::unique_ptr&lt;BaseClass&gt;&amp; ptr, int other_arg); しかし、そうすることには非常に不快感を覚えます。第一に、すでに入力さ_ptrれているものを参照として渡すのは本能的ではないように思われるため、参照の参照となるものです。第二に、関数のシグネチャがさらに大きくなるためです。第三に、生成されたコードでは、変数に到達するために2つの連続したポインターの間接化が必要になるためです。
83 c++  c++11  unique-ptr 



3
関数から一意のvoidポインターを返す
void *CIの関数からを取得するには、次のようにします(非常に基本的な例)。 void *get_ptr(size_t size) { void *ptr = malloc(size); return ptr; } 使用時に同じ結果を得るにはどうすればよいstd::unique_ptr&lt;&gt;ですか?
11 c++  c  unique-ptr 

3
unique_ptr <0または演算子よりも少ないことは何ですか?
私が書いていないコードを扱っています。私はこの声明を持っています: // p is type of std::unique_ptr&lt;uint8_t[]&gt; if (p &lt; 0) { /* throw an exception */ } それではp &lt; 0、この文脈ではどういう意味ですか? 上のドキュメントページ、私は私の場合はあると信じて16) y &lt; nullptrいる、0ですnullptr。 しかし、それは何をしますか?

4
一意のポインタ-デストラクタが3回呼び出されるのはなぜですか
値によってオブジェクトを返すメソッドがあります。このメソッドは、私が制御できないライブラリからのものです。オブジェクトをさらに処理するために、このオブジェクトでunique_ptrを引き続き使用します。次に例を示します。 #include &lt;iostream&gt; #include &lt;memory&gt; class Bla { public: Bla() { std::cout &lt;&lt; "Constructor!\n"; } ~Bla() { std::cout &lt;&lt; "Destructor!\n"; } }; Bla GetBla() { Bla bla; return std::move(bla); } int main() { auto bla = std::make_unique&lt;Bla&gt;(GetBla()); } この例では、次の出力が生成されます。 Constructor! Destructor! Destructor! Destructor! ブラのデストラクターがここで3回呼び出されるのはなぜですか?unique_prtの作成方法は正しいですか?
8 c++  unique-ptr 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.