分配 STL 容器是否安全
is it safe to assign a stl container?
例如:
set<int> s1;
set<int> s2;
s1.insert(1);
s2.insert(2);
s1 = s2;
安全吗?如果是这样,旧元素(以及它们发生的记忆)从何而来?
是的,做作业是安全的。它调用复制构造函数或赋值运算符,旧元素在s1
中被擦除,并替换为 s2
的元素。
[注意:如果存在任何潜在的问题,那么复制构造函数和赋值将被禁止,如fstream
,ofstream
,ifstream
。
是的。旧元素将以通常的方式销毁,并释放任何内存。(当然,像往常一样,如果你将指针存储在容器中,它只会破坏指针,而不会释放它指向的东西)
是的,你的例子是安全的。但请注意:您不会将 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 超出范围时清除。
相关文章:
- 通过网络、跨平台传递std::变体是否安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 在函数结束后使用指向变量的指针是否安全?
- 逐字节删除 void* 是否安全?
- 在 RAII 构造中修改 RVO 值是否安全?
- 线程调用的函数对对象删除是否安全?
- 将对象的字节复制到数组并再次复制回来是否安全
- 使用枚举为数组编制索引是否安全?
- 返回从字符串文本创建的静态string_view是否安全?
- 在cstlib中将#include_next替换为#include是否安全
- 由并发无序映射查找线程调用的函数是否安全?
- 使用 c++ 原子时编写"y=++x"是否安全?
- 从另一个线程发出信号是否安全?
- 从其存储的回调中删除 std::函数是否安全
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 同时调用 ASIO 对象的 API 是否安全?
- 使用自己的迭代器分配容器是否安全?