2012-06-20 7 views
5

stlコンテナを割り当てるのは安全ですか?たとえば、

set<int> s1; 
set<int> s2; 
s1.insert(1); 
s2.insert(2); 
s1 = s2; 

が、それは安全ですか?もしそうなら、古い要素(そしてそれらが発生した記憶)はどこに来たのでしょうか?

+2

これは、クラスと演算子のオーバーロードを使用するうえで便利です。あなたはそれを心配することなく、ユーザーはそのことを世話することができます。 – chris

答えて

4

はい、あなたの例は安全です。しかしメモ:あなたはs1にs2を割り当てません。あなたはs1にs2をコピーします。詳細はこちらをご覧ください:set::operator=

+1

その演算子は一般に*代入演算子*と呼ばれていませんか? – Flexo

+0

@Flexoこれは_copy代入演算子と呼ばれています_ –

+0

@CaptainObvlious [C++ - FAQ-Lite](http://www.parashift.com/c++-faq-lite/assignment-operators.html)はそれを呼び出すものではありません。 – Flexo

5

はい。 古い要素は通常の方法で破棄され、メモリは解放されます。 (もちろん、ポインタをコンテナに格納するとポインタが破棄され、指し示すものは解放されません)

+2

これは実際には間違っています。 's1 = s2'はs2の要素をコピーしてs1に配置します。ブロックの終わりに達すると、両方のオブジェクトは破棄されます。 –

+0

@LukasSchmelzeisen、あなたがコピーしているセットの古い要素。 – chris

+1

私は、s1の古い要素が "破壊され"、s2のときにコンテナによって使用されるメモリが解放されることを明確にする必要があります。もちろん、オブジェクトs1とs2はブロックの最後に削除されます。 – jcoder

6

はい、割り当てを行うのは安全です。コピーコンストラクタまたは代入演算子を呼び出し、古い要素はs1で消去され、s2の要素に置き換えられます。

[注意:任意の潜在的な問題があったであろう場合には、その後、コンストラクタと代入がfstreamofstreamifstreamのように禁止されていたであろうコピーします。]

0

を割り当てが安全です。

代入演算子は、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で休憩中に保存しておきたい内容を残して、単一のポインタを交換します。

関連する問題