問題タブ [copy-and-swap]
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++ - コピー アンド スワップのイディオムを使用して、コピーされたオブジェクトのデストラクタがどのように解放されずにメモリを指しているのでしょうか?
次の質問を読んでいました。
オブジェクトが値渡しされると、そのポインターと値がコピーされますが、渡されたオブジェクトのポインターが指すメモリはコピーされないという印象を受けました。したがって、リンク先の例のように代入演算子をオーバーロードすると、次のようになります。
...コピーされたオブジェクトのデストラクタが、ポイントされたリソースを削除しないのはmArray
なぜですか? 割り当てが行われているオブジェクトには、割り当てがmArray
解除された可能性のあるメモリへのコピーされたポインターがありませんか? 行swap(first.mArray, second.mArray);
は新しいメモリを割り当て、前の配列の内容をコピーしますか?
c++ - SGI STL がコピー アンド スワップ イディオムを使用しないのはなぜですか?
私は最近、コピーアンドスワップイディオムとは何ですか?に関する StackOverflow の回答を読みました。そして、コピーアンドスワップのイディオムができることを知っていました
コードの重複を回避し、強力な例外保証を提供します。
しかし、SGI STLのdeque
実装を調べてみると、イディオムを使用していないことがわかりました。イディオムがどういうわけか「ベストプラクティス」のようなものなら、なぜだろうと思いますか?
c++ - スワップを使用して移動割り当てを実装する
完全に合理的だと思う何かが私に起こりましたが、何かが完全に欠けている場合に備えて、人々の意見を求めています. 最初に、私の理解でT& operator=(T&& rhs)
は、完了時にの内容が何であるかは気にせずrhs
、内容が移動されthis
、rhs
安全に破壊可能であるということです。
そうは言っても、スワップが安価であると仮定すると、コピー代入演算子の一般的な例外セーフ実装は次のようになります。
したがって、移動代入演算子を実装する 1 つの自然な方法は次のようになります。
しかし、それは私に起こりました、rhs
空である必要はありません! では、単にプレーンを実行してみませんswap
か?
これは、移動代入演算子が行う必要があることを満たしていると思います...しかし、私が言ったように、これは私に起こったので、何かが欠けている可能性があると思います.
私が考えることができる唯一の「欠点」this
は、move-construct/swap を実行するバージョンと比較して、単純なスワップを使用すると、所有するものが潜在的に長く存続することです。
考え?
c++ - プライベート データ メンバを持つ抽象クラスのスワップ イディオム
この 2 つのクラスがあり、スワップ イディオムが実装されているとします。基底クラスのコピー コンストラクターと代入演算子は、意味がないため削除されます。ただし、メンバーを保持するため、スワップメソッドが実装されています。
多くの例で見られるように、これは標準的な方法だと思います。ただし、パブリック Base::swap に問題があることがわかりました。抽象基本クラスだけを交換することはできないはずです。
Base クラスのテンプレートを削除し、Base::swap メソッドを保護した方がよいのではないでしょうか。
base から派生した別のクラスがあると仮定すると、最初の実装では ID を交換できますが、派生オブジェクトのデータ メンバーは同じままです。
では、抽象クラスのスワッピングは外部から可能であってはならないという考えでよろしいでしょうか?
c++ - std::vector に 2 つの代入演算子があるのはなぜですか?
2011 年以降、コピーとムーブの両方の割り当てがあります。ただし、この回答は、リソース管理クラスの場合、代入演算子は1つしか必要ないことを非常に説得力を持って主張しています。たとえばstd::vector
、これは次のようになります
ここで重要な点は、引数が値によって取得されることです。other
これは、適切な関数本体が入力された時点で、 (可能であればムーブ コンストラクターによって、そうでない場合はコピー コンストラクターによって)の構築によって多くの作業が既に行われていることを意味します。したがって、これにより、コピーと移動の両方の割り当てが自動的に正しく実装されます。
これが正しければ、なぜ (少なくともこのドキュメントによると)このように実装されてstd::vector
いないのでしょうか?
これがどのように機能するかを説明するために編集します。other
次の例で、上記のコードで何が起こるかを考えてみましょう
c++ - スワップとコピーのイディオムは抽象クラスでは使用できません
抽象クラスでコピー アンド スワップ イディオムを使用しようとすると、興味深いエラーが発生しました。次のコードは、この状況を示すために特別に作成されたものです。不適切なことがあれば教えてください。
エラーメッセージは次のとおりです。
明らかにこの行がこのエラーを引き起こしているので、ここではなく派生クラスで宣言する必要がありますか、それとも他の高度な手法がありますか?