[英]How do you push_back a shared_ptr variable to a vector of shared_ptrs in C++?
[英]C++ - Putting auto_ptrs in a shared_ptr vector
我有一个shared_ptrs的向量。 我目前正在将auto_ptrs放入其中。 这样可以吗?
Room.hpp:
vector<shared_ptr<Item>> items;
void addItem(auto_ptr<Item>);
主要:
room.addItem(auto_ptr<Item>(new Item(...)));
别。 自从C ++ 11起, auto_ptr
就已弃用,并且由于其奇怪的所有权语义而受到批评。 复制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的 auto_ptr
的麻烦,有一篇很好的文章: GotW#25 。
使用boost::ptr_vector
。
这将起作用shared_ptr
具有一个构造函数,该构造函数从auto_ptr
转移所有权。
但是,由于auto_ptr
具有奇怪的破坏性复制语义,因此最好避免使用。 在C ++ 11中,唯一可转让所有权应首选unique_ptr
。 这也可以用来初始化shared_ptr
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.