C++-将auto_ptrs放入shared_ptr向量中
C++ - Putting auto_ptrs in a shared_ptr vector
我有一个shared_ptrs向量。我目前正在安装auto_ptrs。这样可以吗?还是会坏掉?
房间hpp:
vector<shared_ptr<Item>> items;
void addItem(auto_ptr<Item>);
main:
room.addItem(auto_ptr<Item>(new Item(...)));
不要。auto_ptr
在C++11中一直被弃用,并且由于其奇怪的所有权语义而从一开始就受到批评。复制auto_ptr
会将所有权转移到复制的对象。在你的情况下,这可能没问题,但如果你这样做了,例如:
auto_ptr<Item> x = room[1]; // ouch
事情开始变得丑陋起来。
如果需要共享所有权,请使用std::shared_ptr
;如果不需要,则使用std::unique_ptr
。如果你没有C++11编译器,可以使用Boost.SmartPointers。如果你只使用多态性指针而不是共享所有权,那么还有一个Boost.Pointer容器。
如果你真的想保持你的API那样,你需要使用:
addItem(auto_ptr<Item>&&);
请记住,auto_ptr
之后将为空。
-
不要在任何STL容器中使用
auto_ptr
。而且根本不要使用auto_ptr
!gotw:gotw#25上有一篇关于auto_ptr
问题的好文章。 -
使用
boost::ptr_vector
。
这将起作用-shared_ptr
有一个从auto_ptr
转移所有权的构造函数。
然而,auto_ptr
由于其奇怪的破坏性复制语义而最好避免;在C++11中,unique_ptr
应优先用于单一可转让所有权。这也可以用于初始化shared_ptr
。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 为共享 ptr 向量实现复制 c'tor?
- 对唯一 ptr 无效读取的引用向量
- 接口 PTR 的返回向量C++
- 如何在满足谓词的向量中获得唯一PTR的子集
- 通过成员函数将唯一 ptr 的向量附加到另一个向量
- C++ 提升克隆 PTR 向量
- PTR到结构体和PTR到结构体的向量的模板方法专门化