我应该在我的类中的std :: vector成员变量中使用std :: unique_ptr <t>吗?</t>

时间:2012-05-31 08:16:44

标签: c++ stl c++11 smart-pointers visual-c++-2012

想象一个class C,其成员变量m_MyList的类型为std::vector,我希望在其中存储MyClass类型的对象。 C有两个函数可以在m_MyList中添加或删除对象。 m_MyList的消费者也应该可以访问C,因为他们需要阅读MyClass个对象的集合。集合的外部阅读器无法更改集合,因此MyClass对象仅由C拥有。

现在我的问题: 在C ++ 11风格中,向量中存储的最佳T是什么? 可能性似乎是:

  • std::vector<MyClass>
  • std::vector<MyClass*>
  • std::vector<unique_ptr<MyClass>>,使用std:moveunique_ptr推送到vector

2 个答案:

答案 0 :(得分:13)

如果MyClass对象归C所有,那么最好的选择是最简单的:

std::vector<MyClass>

我在这里看到使用std::unique_ptrs的唯一原因是你需要保持指向多态的基类的指针。在这种情况下,unique_ptrs用于在向量被破坏时释放资源。但是C接口不应该将所有权转移给客户端。

答案 1 :(得分:12)

如果C拥有对象,则原始指针(std::vector<MyClass*>)不正确。其他两个非常类似于以下权衡:

  • std::vector<MyClass> - 要求MyClass可以复制和/或移动
  • std::vector<unique_ptr<MyClass>> - 需要(额外)动态分配

在容器上执行的操作类型也可能是相关的。举一个极端的例子,如果MyClass很大并且容器被重复洗牌,那么unique_ptr将是更好的选择。