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

Should I use std::unique_ptr<T> in a std::vector member variable in my class?

本文关键字:std ptr 变量 unique 我应该 gt lt 我的 vector 成员      更新时间:2023-10-16

想象一个class C,它有一个类型为 std::vector 的成员变量m_MyList,我想在其中存储 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

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

std::vector<MyClass>

我能看到在这里使用 std::unique_ptrs 的唯一原因是您是否需要保留指向基类的指针以实现多态性。在这种情况下,unique_ptrs的目的是在媒介被破坏时释放资源。但是,C接口不应将所有权转让给客户端。

如果 C 拥有对象,则原始指针 (std::vector<MyClass*>) 不正确。另外两个非常相似,但需要权衡如下:

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

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