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

Jea*_*ley 0 c++ memory-management smart-pointers

我有一个shared_ptrs的向量.我正在把auto_ptrs放进去.这没关系还是事情会破裂?

Room.hpp:

vector<shared_ptr<Item>> items;
void addItem(auto_ptr<Item>);
Run Code Online (Sandbox Code Playgroud)

主要:

room.addItem(auto_ptr<Item>(new Item(...)));
Run Code Online (Sandbox Code Playgroud)

pmr*_*pmr 8

别.auto_ptr由于其奇特的所有权语义,它在C++ 11中已经被弃用,并且从一开始就受到批评.复制auto_ptr将所有权转移到复制的对象.在您的情况下可能没问题,但如果您这样做,例如:

auto_ptr<Item> x = room[1]; // ouch
Run Code Online (Sandbox Code Playgroud)

事情开始变得难看.

std::shared_ptr如果您需要共享所有权,请使用a; 如果不需要,则使用a std::unique_ptr.如果您没有C++ 11编译器,请使用Boost.SmartPointers.如果您只使用指针进行多态而不是共享所有权,那么还有一个Boost.Pointer容器.

如果您真的希望以这种方式保留API,则需要使用:

addItem(auto_ptr<Item>&&);
Run Code Online (Sandbox Code Playgroud)

请记住,auto_ptr之后将是空的.

  • @JeanFinley`unique_ptrS`无法复制.只有移动,你需要安装它们或使用`room.push_back(std :: move(ptr))`将它们放入容器中. (2认同)