例えば:
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
ます。
[注: 潜在的な問題があった場合、コピー コンストラクターと代入は , , のようfstream
にofstream
禁止されていifstream
ました。]
はい。古い要素は通常の方法で破棄され、メモリは解放されます。(もちろん、コンテナにポインタを格納すると、ポインタが破棄されるだけで、ポインタが指すものは解放されません)
はい、あなたの例は安全です。ただし、注意: s2 を s1 に割り当てるのではなく、s2 を s1 にコピーします。詳細については、これを参照してください: set::operator=
割り当ては安全です。
代入演算子は、デストラクタ(この例ではintの簡単なno-op)を呼び出すことにより、s1に元々含まれていたオブジェクトを破棄します。セットがメモリも解放するか、後で追加される要素で使用するために初期化されていないメモリとして保持するかは、実装次第です。
s1の新しいオブジェクトはs2のオブジェクトからコピーされますが、これにはかなりの時間がかかる場合があります。割り当て後にs2を保持したくない場合は、2つのコンテナーを交換するか、C++11の移動割り当てを使用することをお勧めします。
std::swap(s1, s2); // Backwards-compatible swap
s1 = std::move(s2); // C++11 rvalue move assignment
これらは両方とも、おそらく1つのポインターを交換するだけで、保持したいコンテンツをs1に残し、残りをs2に残して、s2がスコープ外になったときにクリアされます。