私は shared_ptrs のベクトルを持っています。私は現在 auto_ptrs を入れています。それは大丈夫ですか、それとも壊れますか?
ルーム.hpp:
vector<shared_ptr<Item>> items;
void addItem(auto_ptr<Item>);
主要:
room.addItem(auto_ptr<Item>(new Item(...)));
私は shared_ptrs のベクトルを持っています。私は現在 auto_ptrs を入れています。それは大丈夫ですか、それとも壊れますか?
ルーム.hpp:
vector<shared_ptr<Item>> items;
void addItem(auto_ptr<Item>);
主要:
room.addItem(auto_ptr<Item>(new Item(...)));
しないでください。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
後で空になることに注意してください。
auto_ptr
STL コンテナーでは使用しないでください。そして絶対使わないauto_ptr
!gotwauto_ptr
に のトラブルに関する良い記事があります: GotW#25。
を使用しboost::ptr_vector
ます。
それはうまくいきます -shared_ptr
から所有権を移すコンストラクタがありauto_ptr
ます。
ただし、auto_ptr
その奇妙な破壊的コピーのセマンティクスのため、避けるのが最善です。C++11 では、unique_ptr
単一の譲渡可能な所有権に優先する必要があります。これは、を初期化するためにも使用できますshared_ptr
。