11

RAW ポインターをスマート ポインターの形式でラップして、例外セーフ メモリ管理を実現する必要があることは誰もが知っています。しかし、ポインターのコンテナーになると、問題はさらに厄介になります。

std コンテナーは、含まれているオブジェクトがコピー可能であることを主張するため、これにより std::auto_ptr の使用が除外されますが、boost::shared_ptr などは引き続き使用できます。

ただし、ポインターを安全に保持するように明示的に設計されたブースト コンテナーもいくつかあります。ポインター コンテナー ライブラリ
を参照してください。

問題は、smart_pointers のコンテナーよりも ptr_containers を使用した方がよい条件は何ですか?

boost::ptr_vector<X>

or

std::vector<boost::shared_ptr<X> >
4

3 に答える 3

13

ブースト ポインター コンテナーには、保持するリソースに対する厳密な所有権があります。std::vector<boost::shared_ptr<X>> は所有権を共有しています。必要な理由はいくつかありますが、そうでない場合はデフォルトで boost::ptr_vector<X> を使用します。YMMV。

于 2008-09-22T16:50:44.417 に答える
3

着実に: スマート ポインターは、リソース管理を処理するための非常に優れた方法ですが、唯一の方法ではありません。適切に記述された C++ コードでは生のポインターはほとんど見られないことに同意しますが、私の経験では、スマート ポインターもそれほど多くは見られません。生ポインタのコンテナを使用して実装された、完全に例外セーフなクラスがたくさんあります。

于 2008-09-22T16:58:45.597 に答える
2

まあ、オーバーヘッドは1つのケースです。

共有ポインターのベクトルは、サイズ変更時に、新しいスマート ポインターの作成、参照のインクリメント、参照のデクリメントなどを含む多くの不要なコピーを実行します。ポインター コンテナーを使用すると、これらすべてを回避できます。

ただし、コンテナ操作がボトルネックであることを確認するためにプロファイリングが必要です:)

于 2008-09-22T16:49:23.450 に答える