自動ポインタはオブジェクトを所有しているのに対し、共有ポインタはそれらを指す多くのオブジェクトを持つことができると聞いています。共有ポインタを常に使用しないのはなぜですか。
これに関連して、スマートポインターとは、人々はこの用語を共有ポインターと同じ意味で使用します。彼らは同じですか?
自動ポインタはオブジェクトを所有しているのに対し、共有ポインタはそれらを指す多くのオブジェクトを持つことができると聞いています。共有ポインタを常に使用しないのはなぜですか。
これに関連して、スマートポインターとは、人々はこの用語を共有ポインターと同じ意味で使用します。彼らは同じですか?
std::auto_ptr
は、排他的ポインタ所有権の古い、非推奨の実装です。std::unique_ptr
C++11ではに置き換えられました。排他的所有権とは、ポインターが何かによって所有されており、オブジェクトの存続期間が所有者の存続期間に関連付けられていることを意味します。
共有ポインタ(std::shared_ptr
)は、共有ポインタの所有権を実装します—単一の所有者がいないため、オブジェクトへの参照が有効である限り、オブジェクトを有効に保ちます。これは通常、参照カウントを使用して実行されます。つまり、一意のポインターではなく、実行時のオーバーヘッドが追加されます。また、共有所有権についての推論は、排他的所有権についての推論よりも困難です。破壊のポイントは、決定論的ではなくなります。
スマートポインターは、ポインターのように動作するすべてのタイプを含む用語ですが、rawとは対照的に(スマート)セマンティクスが追加されていT*
ます。unique_ptr
とは両方ともshared_ptr
スマートポインタです。
共有ポインタは参照カウントを保持するため、少しコストがかかります。場合によっては、複数の再帰レベルで共有ポインターを持つ複雑な構造を持っている場合、1つの変更がそれらのポインターの多くの参照カウントに影響を与える可能性があります。
また、複数のCPUコアアーキテクチャでは、複数のコアが現在同じメモリ領域にアクセスしている場合、参照カウントのアトミック更新は少なくともわずかにコストがかかることはありませんが、実際には実際にはコストがかかります。
ただし、共有ポインタはシンプルで安全に使用できますが、自動ポインタの割り当てプロパティは混乱を招き、非常に危険になる可能性があります。
スマートポインターは通常、共有ポインターの同義語として頻繁に使用されますが、実際には、共有ポインターに類似したものを含め、ブーストでのさまざまなポインターの実装をすべてカバーしています。
スマートポインタにはさまざまな形式があります。現在C++11にあるBoostに触発されたshared_ptrはそれらの1つです。多くの癖があるauto_ptrの代わりに、疑わしい場合はほとんどすべての場所でshared_ptrを使用することをお勧めします。
つまり、shared_ptrは、同じオブジェクトを共有するための単なる参照カウントの実装です。
参照: http ://www.gotw.ca/publications/using_auto_ptr_effectively.htm http://en.cppreference.com/w/cpp/memory/shared_ptr