分配 STL 容器是否安全

is it safe to assign a stl container?

本文关键字:是否 安全 STL 分配      更新时间:2023-10-16

例如:

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

安全吗?如果是这样,旧元素(以及它们发生的记忆)从何而来?

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

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

是的。旧元素将以通常的方式销毁,并释放任何内存。(当然,像往常一样,如果你将指针存储在容器中,它只会破坏指针,而不会释放它指向的东西)

是的,你的例子是安全的。但请注意:您不会将 s2 分配给 s1,而是将 s2 复制到 s1。有关更多信息,请参阅以下内容:set::运算符=

作业是安全的。

赋值运算符将通过调用它们的析构函数来销毁最初包含在 s1 中的对象(示例中 int 的微不足道的无操作)。集合是否也释放内存,还是将其保留为未初始化的内存以供后续添加的元素使用,取决于实现。

s1 中的新对象将从 s2 中的对象复制,这可能需要相当长的时间。如果您不想在分配后保留 s2,更好的方法可能是交换两个容器或使用 C++11 移动分配。

std::swap(s1, s2);  // Backwards-compatible swap
s1 = std::move(s2); // C++11 rvalue move assignment

这两者都很可能只是交换一个指针,将要保留在 s1 中的内容保留在 s2 中,其余内容保留在 s2 超出范围时清除。