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

C++ - Putting auto_ptrs in a shared_ptr vector

本文关键字:ptr 向量 shared ptrs auto C++- 放入      更新时间:2023-10-16

我有一个shared_ptrs向量。我目前正在安装auto_ptrs。这样可以吗?还是会坏掉?

房间hpp:

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

main:

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

不要。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容器。

如果你真的想保持你的API那样,你需要使用:

addItem(auto_ptr<Item>&&);

请记住,auto_ptr之后将为空。

  1. 不要在任何STL容器中使用auto_ptr。而且根本不要使用auto_ptrgotw:gotw#25上有一篇关于auto_ptr问题的好文章。

  2. 使用boost::ptr_vector

这将起作用-shared_ptr有一个从auto_ptr转移所有权的构造函数。

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