分配一个stl容器是否安全?

时间:2012-06-20 16:11:20

标签: c++ stl variable-assignment

例如:

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

安全吗?如果是这样,旧元素(以及它们发生的内存)来自哪里?

4 个答案:

答案 0 :(得分:6)

是的,完成作业是安全的。它调用复制构造函数或赋值运算符,旧元素在s1中被删除,并被s2的元素替换。

[注意:如果存在任何潜在问题,则复制构造函数和赋值将被禁止,例如fstreamofstreamifstream。]

答案 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中的内容清除。