問題タブ [unique-ptr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - pimpl: pimpl でポインタからポインタへのポインタを避ける
この質問では、「pimpl: shared_ptr or unique_ptr」と尋ねました。pimpl イディオムの適切な使用法は、 aunique_ptr
ではなく aを使用することであると確信しましたshared_ptr
。ユーザーにはポインターがまったくないかのように動作する必要がありますが、shared_ptr
コピー時にエイリアシングが導入されることは明らかであり、これは間違いなくポインターのように動作します。
したがって、ユーザーがshared_ptr
私の pimpl オブジェクトに を作成したいとしましょう (実際に複数のエイリアスが必要な場合など)。例えば:
それは私の実装を指すことになりますshared_ptr
。unique_ptr
次のようなものを達成できればいいのですが:
しかし、どうにかしてポインタからポインタへのポインタを取り除き、pimpl の実装の非表示を維持します。
これを達成する方法についてのアイデア (行 (2) と明らかに変更できてうれしいですが、my_pimpl
行 (3) と (4) は同じままにしておきたい)。
c++ - std::unique_ptrの使用法
ここでは、p2も参照しているため、p1は「一意」ではなくなっているようです。
それは合法的なC++ですか?unique_ptrにはcopy_semanticsがありますか?いいえの場合、および移動セマンティクスしかない場合、p2に割り当てた後にp1はNULLに設定されますか?
編集:
わかりました。正しいバージョンは
それによると、この割り当ての後、p1は無効ですか?そして、auto_ptrとの違いはここにありますか?auto_ptrの場合のように、暗黙的に所有権の譲渡を明示的に指定するよりも安全です。
c++ - NULL 値を返す
framebufferd3d11.h のスニペット
framebufferd3d11.cpp のスニペット
icc でコンパイルすると、NULL は 0 として定義されるため、NULL の代入値に問題が発生します。このような問題を解決するにはどうすればよいですか?
c++ - あるベクトルから別のベクトルへのunique_ptrsの移動
それらのソートされていないベクトルに格納されているunique_ptrを、ポインターのソートされたベクトルを含む別のベクトルに移動したいと思います。
確かにunique_ptrを移動しても、最初のベクトルの要素は自動的に消去されませんか?これどうやってするの?
私がやりたいことの例:
意図が明確であることを願っています。
更新:私のアルゴリズムでは、インプレースソートが許可されていません。今日誰かが気分がいいなら(私は尋ねていません、私の質問については上記を参照してください)、この状況のためにそれを自由に実装して見せてください。私は本当に「移動による並べ替え」が必要です。そして、なぜ引っ越しがそれほど高価になるのか、私にはよくわかりません。
c++11 - std::unique_ptr が指すオブジェクトを変更する関数
コードのどこかに local がありstd::unique_ptr<T>
ます。指しているオブジェクトを操作する必要があり、そのために関数を使用します。
この関数を次のように呼び出します。
必要な機能を取得するためのより良い方法はありますか? 2 つの動きはかなり不必要であり、潜在的に危険なようです。ここには示していないエラー処理コードがありますが、それは重要ではありません。
c++ - std::unique_ptr ですT の完全な定義を知る必要がありますか?
ヘッダーに次のようなコードがあります。
型定義を含まない cpp にこのヘッダーを含めると、Thing
VS2010-SP1 でコンパイルされません。
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\memory(2067): エラー C2027: 未定義の型 'Thing' の使用
に置き換えstd::unique_ptr
てstd::shared_ptr
コンパイルします。
したがって、完全な定義が必要なのは現在の VS2010std::unique_ptr
の実装であり、完全に実装に依存していると思います。
またはそれは?std::unique_ptr
の実装が前方宣言のみで動作することを不可能にする標準要件に何かありますか? へのポインターだけを保持する必要があるため、奇妙に感じThing
ますね。
c++ - 関数から返されるunique_ptrのスコープは何ですか?
これは正しく機能しますか?(例を参照)
c++11 - unique_ptrカスタムストレージタイプの例?
ハワード・ヒナントは、 カスタムストレージタイプも使用できると説明しました。彼は例として「共有メモリ」に言及しています。unique_ptr
彼は大まかなアイデアを与えるだけです(これは簡単なイントロには問題ありません)。しかし、誰でも「カスタムストレージタイプ」(共有メモリかどうかに関係なく)の例を完成させることができますか?
共有メモリへの配置をサポートするため
unique_ptr
に、カスタムデリータにカスタムポインタタイプを含めることができます(通常、共有メモリアプリケーションでは実際のポインタではありません)。ポインタの動作をエミュレートするポインタと呼ばれるネストされた型を削除機能内に配置するだけで、一般にアクセスできます。
私はそれを// ...
拡張する必要があるとtest()
思います、そしておそらく実際の「カスタムストレージタイプ」の例でいくつかの追加のことをするでしょう。
誰かがどこにいるのか教えてもらえますか
- 実際にはすでにこのカスタマイズを使用しています、
- そしてその文脈では、
- どのカスタマイズコード、(
//...
おそらく) - そして、クライアントコードはそれをどのように使用しますか?(
test()
おそらく)
c++11 - イニシャライザ リスト (C++0x) のクロージャ デリータとコンパイラの警告
warning C4355: 'this' : used in base member initializer list
Visual C++ 2010 から取得します。
ハンドルを保持しているクラスがあり、クラスの ctor が失敗した場合でもハンドルを自動的に閉じたい(そのため、dtor は呼び出されません)。ただし、ハンドル ラッピング クラス全体をわざわざ作成したくはありません。むしろ、それをスマート ポインターに保持したいと考えています。そして、私はこれを書いた:
クロージャーの前に、 _handle を のようなもので初期化していまし_handle(nullptr, bind(PortDeleter, placeholders::_1, ref(_log)))
たが、それには別の定義が必要です。
私の質問: 警告は、この特定のインスタンスに対する懸念事項ですか? いずれにせよ、詳細な理由は何ですか?それを回避する簡単な方法はありますか?
c++ - unique_ptrs の STL 回転 const_iterators
unique_ptr の中間で const_iterator で std::rotate を使用すると問題が発生します。
私が試してみました:
これにより、rotate(...iterator, ...const_iterator &, ...iterator) の呼び出しに一致する関数がなくなります。
したがって、私はこれを試しました: std::vector >::const_iterator first = vec.begin(); std::vector >::const_iterator last = vec.end(); std::rotate(最初、中間、最後);
次に、以下に示す一連のエラーメッセージが表示されます。これはバグですか、それとも何かミスをしましたか?