我应该<T>在我的类的 std::vector 成员变量中使用 std::unique_ptr 吗?
Should I use std::unique_ptr<T> in a std::vector member variable in my class?
想象一个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:move
将unique_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
将是更好的选择。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- 引用 std::shared:ptr 以避免引用计数
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- 使用std :: String ptr的错误打印std :: String
- C++中的大小释放:全局运算符delete的正确行为是什么(void*ptr,std::size_t size)
- std::哈希表示无序映射中的唯一 PTR
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- 正确使用std智能指针以确保ptr安全
- 如何创建 std::string 包装器,它将 ptr 保留为 std::string 和 ptr 到创建该包装器实例的
- 为什么 std::string{ "const char ptr" } 有效?
- 为什么 gcc 4.9.0 中没有定义"void operator delete(void* ptr, std::size_t size) noexcept;"?
- 在 std::map 的值中使用非 ptr 是一种很好的做法吗
- 共享 PTR - C++:std::shared_ptr<T> 和 std::shared_ptr<T const> 有什么区别?