unique_ptr - 重大改进?

21 c++ programming-languages language-design c++11

在实际的C++标准中,创建满足以下规则的集合即使不是不可能也很难:

  1. 异常安全,
  2. 廉价的内部操作(在实际的STL容器中:操作是副本),
  3. 自动内存管理.

为了满足(1),集合不能存储原始指针.为了满足(2),集合必须存储原始指针.为了满足(3),集合必须按值存储对象.

结论:这三个项目相互冲突.

当使用shared_ptrs 时,将不满足Item(2),因为当一个集合需要移动一个元素时,它需要进行两次调用:构造函数和析构函数.不可能进行大规模memcpy()的复制/移动操作.

我是否正确所描述的问题将通过unique_ptr和解决std::move()?使用这些工具的馆藏将能够满足所有3个条件:

  1. 当一个集合作为异常的副作用被删除时,它将调用unique_ptr析构函数.没有内存泄漏.
    • unique_ptr不需要任何额外的空间用于参考计数器; 因此它的身体应该与包裹的指针完全相同
    • 我不确定,但看起来这允许unique_ptrs通过使用memmove()类似操作()来移动组,
    • 即使不可能,std::move()操作员也可以在unique_ptr不进行构造函数/析构函数对调用的情况下移动每个对象.
  2. unique_ptr将拥有给定记忆的独家所有权.不会发生意外的内存泄漏.

这是真的?使用的其他优点是unique_ptr什么?

Jam*_*kin 6

我完全同意.最后一种处理堆分配对象的自然方式.

回答:

我不确定,但看起来这允许unique_ptr通过使用memmove()类似的操作来移动s 组,

有一个提议允许这个,但它没有进入C++ 11标准.