0

我有一个 shared_ptrs 的向量。我目前正在将 auto_ptrs 放入其中。没关系还是会破裂?

房间.hpp:

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

主要的:

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

3 回答 3

8

不。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之后将是空的。

于 2012-07-12T12:21:29.070 回答
2
  1. 不要auto_ptr在任何 STL 容器中使用。并且根本不要使用auto_ptr关于gotwauto_ptr的麻烦有一篇很好的文章:GotW#25

  2. 使用boost::ptr_vector.

于 2012-07-12T12:48:06.153 回答
1

这将起作用 -shared_ptr具有从auto_ptr.

但是,auto_ptr最好避免使用,因为它具有奇怪的破坏性复制语义;在 C++11 中,unique_ptr对于单一可转让所有权应该是首选。这也可以用来初始化一个shared_ptr.

于 2012-07-12T13:08:59.630 回答