我有一个shared_ptrs的向量。我正在把auto_ptrs放进去。这样可以,还是会破坏?
Room.hpp:
vector<shared_ptr<Item>> items;
void addItem(auto_ptr<Item>);
主:
room.addItem(auto_ptr<Item>(new Item(...)));
答案 0 :(得分:8)
别。 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 Container。
如果您真的希望以这种方式保留API,则需要使用:
addItem(auto_ptr<Item>&&);
请注意,之后auto_ptr
将为空。
答案 1 :(得分:2)
不要在任何STL容器中使用auto_ptr
。并且根本不要使用auto_ptr
!有关auto_ptr
在 getw :GotW#25上遇到麻烦的文章很好。
使用boost::ptr_vector
。
答案 2 :(得分:1)
这将有效 - shared_ptr
有一个构造函数,可以从auto_ptr
转移所有权。
然而,由于其奇怪的破坏性复制语义,最好避免使用auto_ptr
;在C ++ 11中,unique_ptr
应该是单个可转让所有权的首选。这也可用于初始化shared_ptr
。