6

この質問に対する timdays の回答を読んだ後、 と の違いに興味があります。私は、 aはそれに与えられたポインタに対する所有権を持っていて、解放時に、その住民への他の参照に関係なく、含まれているすべてのポインタのデストラクタを呼び出すという印象を受けました。ref カウントが 0 の場合にのみ、解放後にポインター自体を解放するa の目的に反しているのはどれですか?boost::ptr_containerstd::vector<shared_ptr>boost::ptr_containerstd::vector<shared_ptr>

これが事実である場合(そうではないと思います)、Boostのドキュメントの例でさえ、目的が似ているかのように2つを比較するのはなぜですか。boost::ptr_containerstd::vector<shared_ptr>

4

2 に答える 2

9

そうです、この 2 つは大きく異なります。

お気づきのように、最初の違いは所有権のセマンティクスです。Pointer Container 内のアイテムの所有権は共有されません。この点で、 aboost::ptr_vector<T>は a にはるかに近いstd::vector<std::unique_ptr<T>>です。

しかし、違いはこれだけではありません!

  • タイプで明示的に指定されていない限り、ポインタ コンテナにはヌル ポインタは含まれません。
  • Pointer Container には (メソッドを使用した) ディープ コピー セマンティクスがnew_cloneあり、保持されているオブジェクトがコピー可能な場合にのみコピーできます。
  • Pointer Container には深い const セマンティクスがあります。つまり、コンテナーがconstその要素の 1 つを変更できない場合です。

なぜ@timdayBoost Pointer Container に言及せざるを得ないと感じたのかというと、彼は質問を少し広げたかったからだと思います。ブースト ポインター コンテナーは、複数のオブジェクトを保持できるスマート ポインターに非常によく似ており、一般的なポインターのコンテナーよりも優れた構文を提供します。

彼の a との比較については、STL コンテナーでは使用できないため、移動セマンティクスがない場合 ( no )std::vector< boost::shared_ptr<T> >にポインターのベクトルを実装する従来の方法であるためだと思います。ほとんどの場合、人々はポインターコンテナーについて知りません...unique_ptrauto_ptr

于 2011-01-29T13:07:37.480 に答える
1

両方を適用できる状況があります。たとえば、一連の関数がコンテナのクライアントとして機能し、ポリモーフィック オブジェクトへのポインタを取得して操作を実行します。コンテナーがすべての関数よりも長く存続する場合は、ポインター コンテナーに置き換えることができます。

Timday は、リストの省略を指摘して、「次の一連のポインターの違いは何ですか」という質問に答えました。

于 2011-01-29T11:32:17.730 に答える