簡體   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