例如:
set<int> s1;
set<int> s2;
s1.insert(1);
s2.insert(2);
s1 = s2;
安全吗?如果是这样,旧元素(以及它们发生的内存)来自哪里?
答案 0 :(得分:6)
是的,完成作业是安全的。它调用复制构造函数或赋值运算符,旧元素在s1
中被删除,并被s2
的元素替换。
[注意:如果存在任何潜在问题,则复制构造函数和赋值将被禁止,例如fstream
,ofstream
,ifstream
。]
答案 1 :(得分:5)
是。 旧元素将以通常的方式被销毁并释放任何内存。 (当然,像往常一样,如果你将指针存储在容器中,它只会破坏指针,并且不会释放它所指向的东西)
答案 2 :(得分:4)
是的,你的例子是安全的。但请注意:您没有将s2分配给s1,而是将s2复制到s1。有关详细信息,请参阅:set::operator=
答案 3 :(得分:0)
分配是安全的。
赋值运算符将通过调用它们的析构函数来破坏s1中最初包含的对象(在您的示例中为int的一个简单的无操作)。该集合是否释放内存,或者将其保留为未初始化的内存以供后续添加的元素使用,取决于实现。
s1中的新对象将从s2中的新对象复制,这可能需要相当长的时间。如果您不想在分配后保留s2,更好的方法可能是交换两个容器或使用C ++ 11移动分配。
std::swap(s1, s2); // Backwards-compatible swap
s1 = std::move(s2); // C++11 rvalue move assignment
这两个很可能只是交换一个指针,当s2超出范围时,将要保留在s1中的内容和其余在s2中的内容清除。