在实际的 C++ 标准中,创建满足以下规则的集合即使不是不可能也很难:
- 异常安全,
- 廉价的内部操作(在实际的 STL 容器中:操作是副本),
- 自动内存管理。
为了满足 (1),集合不能存储原始指针。为了满足 (2),集合必须存储原始指针。为了满足 (3),集合必须按值存储对象。
结论:三项相互冲突。
使用 s时不会满足第 (2) 项,shared_ptr
因为当集合需要移动元素时,它需要进行两次调用:构造函数和析构函数。不可能进行大规模memcpy()
的复制/移动操作。
我是否正确,所描述的问题将由unique_ptr
and解决std::move()
?使用这些工具的集合将能够满足所有 3 个条件:
- 当一个集合作为异常的副作用而被删除时,它将调用
unique_ptr
' 析构函数。没有内存泄漏。 unique_ptr
参考计数器不需要任何额外空间;因此它的主体应该与包装指针的大小完全相同,- 我不确定,但看起来这允许
unique_ptrs
通过使用memmove()
类似操作(?)来移动组, - 即使不可能,
std::move()
操作员也将允许移动每个unique_ptr
对象,而无需调用构造函数/析构函数对。
unique_ptr
将拥有给定内存的独占所有权。不会发生意外的内存泄漏。
这是真的?使用的其他优点是unique_ptr
什么?