set<int> s1;
set<int> s2;
s1.insert(1);
s2.insert(2);
s1 = s2;
が、それは安全ですか?もしそうなら、古い要素(そしてそれらが発生した記憶)はどこに来たのでしょうか?
set<int> s1;
set<int> s2;
s1.insert(1);
s2.insert(2);
s1 = s2;
が、それは安全ですか?もしそうなら、古い要素(そしてそれらが発生した記憶)はどこに来たのでしょうか?
はい、あなたの例は安全です。しかしメモ:あなたはs1にs2を割り当てません。あなたはs1にs2をコピーします。詳細はこちらをご覧ください:set::operator=
はい。 古い要素は通常の方法で破棄され、メモリは解放されます。 (もちろん、ポインタをコンテナに格納するとポインタが破棄され、指し示すものは解放されません)
はい、割り当てを行うのは安全です。コピーコンストラクタまたは代入演算子を呼び出し、古い要素はs1
で消去され、s2
の要素に置き換えられます。
[注意:任意の潜在的な問題があったであろう場合には、その後、コンストラクタと代入がfstream
、ofstream
、ifstream
のように禁止されていたであろうコピーします。]
を割り当てが安全です。
代入演算子は、s1に含まれていたオブジェクトを、そのデストラクタを呼び出して破棄します(例ではintの単純なno-op)。このセットがメモリを解放するか、後で追加される要素によって使用される初期化されていないメモリとして保持されるかは、実装次第です。
s1の新しいオブジェクトはs2のオブジェクトからコピーされますが、かなりの時間がかかることがあります。割り当て後にs2を保持したくない場合は、2つのコンテナをスワップするか、C++ 11の移動割り当てを使用する方が良いでしょう。
これらのstd::swap(s1, s2); // Backwards-compatible swap
s1 = std::move(s2); // C++11 rvalue move assignment
の両方が最も可能性が高いだけでは、s2がスコープ外になったときにクリアされるように、s1とs2で休憩中に保存しておきたい内容を残して、単一のポインタを交換します。
これは、クラスと演算子のオーバーロードを使用するうえで便利です。あなたはそれを心配することなく、ユーザーはそのことを世話することができます。 – chris