繁体   English   中英

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

[英]C++ - Putting auto_ptrs in a shared_ptr vector

我有一个shared_ptrs的向量。 我目前正在将auto_ptrs放入其中。 这样可以吗?

Room.hpp:

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

主要:

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

别。 自从C ++ 11起, auto_ptr就已弃用,并且由于其奇怪的所有权语义而受到批评。 复制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_ptr 关于gotw的 auto_ptr的麻烦,有一篇很好的文章: GotW#25

  2. 使用boost::ptr_vector

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM