C ++ - 将auto_ptrs放在shared_ptr向量中

时间:2012-07-12 12:18:39

标签: c++ memory-management smart-pointers

我有一个shared_ptrs的向量。我正在把auto_ptrs放进去。这样可以,还是会破坏?

Room.hpp:

vector<shared_ptr<Item>> items;
void addItem(auto_ptr<Item>);

主:

room.addItem(auto_ptr<Item>(new Item(...)));

3 个答案:

答案 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)

  1. 不要在任何STL容器中使用auto_ptr。并且根本不要使用auto_ptr!有关auto_ptr getw GotW#25上遇到麻烦的文章很好。

  2. 使用boost::ptr_vector

答案 2 :(得分:1)

这将有效 - shared_ptr有一个构造函数,可以从auto_ptr转移所有权。

然而,由于其奇怪的破坏性复制语义,最好避免使用auto_ptr;在C ++ 11中,unique_ptr应该是单个可转让所有权的首选。这也可用于初始化shared_ptr