0

私は shared_ptrs のベクトルを持っています。私は現在 auto_ptrs を入れています。それは大丈夫ですか、それとも壊れますか?

ルーム.hpp:

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

主要:

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

3 に答える 3

8

しないでください。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後で空になることに注意してください。

于 2012-07-12T12:21:29.070 に答える
2
  1. auto_ptrSTL コンテナーでは使用しないでください。そして絶対使わないauto_ptrgotwauto_ptrに のトラブルに関する良い記事があります: GotW#25

  2. を使用しboost::ptr_vectorます。

于 2012-07-12T12:48:06.153 に答える
1

それはうまくいきます -shared_ptrから所有権を移すコンストラクタがありauto_ptrます。

ただし、auto_ptrその奇妙な破壊的コピーのセマンティクスのため、避けるのが最善です。C++11 では、unique_ptr単一の譲渡可能な所有権に優先する必要があります。これは、を初期化するためにも使用できますshared_ptr

于 2012-07-12T13:08:59.630 に答える