我有一个 shared_ptrs 的向量。我目前正在将 auto_ptrs 放入其中。没关系还是会破裂?
房间.hpp:
vector<shared_ptr<Item>> items;
void addItem(auto_ptr<Item>);
主要的:
room.addItem(auto_ptr<Item>(new Item(...)));
我有一个 shared_ptrs 的向量。我目前正在将 auto_ptrs 放入其中。没关系还是会破裂?
房间.hpp:
vector<shared_ptr<Item>> items;
void addItem(auto_ptr<Item>);
主要的:
room.addItem(auto_ptr<Item>(new Item(...)));
不。auto_ptr
由于其奇怪的所有权语义,在 C++11 中已被弃用并从一开始就受到批评。复制一个auto_ptr
将所有权转移到复制的对象。在您的情况下,这可能没问题,但如果您这样做,例如:
auto_ptr<Item> x = room[1]; // ouch
事情开始变得丑陋。
std::shared_ptr
如果您需要共享所有权,请使用 a ,如果不需要,请使用 a std::unique_ptr
。如果您没有 C++11 编译器,请使用 Boost.SmartPointers。如果您仅将指针用于多态性而不是共享所有权,那么还有一个Boost.Pointer 容器。
如果您真的想以这种方式保留您的 API,您需要使用:
addItem(auto_ptr<Item>&&);
请记住,auto_ptr
之后将是空的。
不要auto_ptr
在任何 STL 容器中使用。并且根本不要使用auto_ptr
!关于gotwauto_ptr
的麻烦有一篇很好的文章:GotW#25。
使用boost::ptr_vector
.
这将起作用 -shared_ptr
具有从auto_ptr
.
但是,auto_ptr
最好避免使用,因为它具有奇怪的破坏性复制语义;在 C++11 中,unique_ptr
对于单一可转让所有权应该是首选。这也可以用来初始化一个shared_ptr
.