質問
例外安全なメモリ管理を実現するには、RAW ポインタを何らかの形式のスマート ポインタでラップする必要があることは誰もが知っています。しかし、ポインタのコンテナとなると、問題はさらに厄介になります。
std コンテナは、含まれるオブジェクトがコピー可能であることを要求するため、std::auto_ptr の使用は除外されますが、boost::shared_ptr などは引き続き使用できます。
ただし、ポインターを安全に保持するために明示的に設計されたブースト コンテナーもいくつかあります。
見る ポインタコンテナライブラリ
質問は:どのような状況では、smart_pointers のコンテナではなく ptr_containers を使用することを優先する必要がありますか?
boost::ptr_vector<X>
or
std::vector<boost::shared_ptr<X> >
解決
ブースト ポインター コンテナーは、保持するリソースに対して厳密な所有権を持ちます。std::vector<boost::shared_ptr<X>> は共有所有権を持ちます。それが必要な理由はいくつかありますが、そうでない場合に備えて、デフォルトで boost::ptr_vector<X> を使用します。YMMV。
他のヒント
常時オン:スマート ポインタはリソース管理を処理する非常に優れた方法ですが、唯一の方法ではありません。よく書かれた C++ コードでは生のポインターがほとんど見られないことに同意しますが、私の経験では、スマート ポインターもそれほど多くは見られません。生のポインターのコンテナーを使用して実装された完全に例外安全なクラスがたくさんあります。
そうですね、オーバーヘッドも 1 つのケースです。
共有ポインタのベクトルは、サイズ変更時に新しいスマート ポインタの作成、参照のインクリメント、参照のデクリメントなどを含む多くの無関係なコピーを実行します。これらはすべて、ポインター コンテナーを使用して回避されます。
ただし、コンテナ操作がボトルネックであることを確認するにはプロファイリングが必要です:)