質問

コードでboost :: scoped_ptrを多く使用していますが、それは素晴らしいことですが、現在、あらゆる場所でshared_ptrを使用しているソフトウェアで作業しており、何かが足りないのではないかと思っています。

AFAIK a shared_ptrは、異なるスレッドが同じデータにアクセスしようとしていて、スレッドが終了する順序がわからない場合にのみ役立ちます(shared_ptrは、最後のスレッドが終了するまでオブジェクトが存在することを保証します)それ)。

他のユースケースはありますか?

役に立ちましたか?

解決

スレッドはここでは無関係です。関連するのは、オブジェクトが使用されなくなったポイントを簡単に指定できるかどうかです。

複数の異なるオブジェクトが同じオブジェクトを使用したいとします。それは、データのパック、入力/出力、または何らかの幾何学的なオブジェクト、その他何でもかまいません。使用中のオブジェクトがすべて削除された後、前のクロックサイクルではなく、共有オブジェクトが削除されるようにします。どの所有オブジェクトの寿命が最も長くなるかを判断するのではなく(プログラムを変更した場合、またはユーザーの操作によって変更される場合があります)、shared_ptrを使用してこの動作を強制できます。

使用するオブジェクトが同じスレッドにあるか異なるスレッドにあるかは関係ありません。オブジェクトは、すべてが同じスレッド内にある場合でも、予測できない存続期間を持つことができます。

他のヒント

  

AFAIK shared_ptrは、次の場合にのみ有用です。   異なるスレッドは   同じデータにアクセスする

まあ、それは複数の所有者がスマートポインターが指す同じオブジェクトを所有している状況です。異なるスレッドからスマートポインターにアクセスする場合があり、 shared_ptr もその領域で使用できますが、それは主要なポイントではありません。最後の所有者が指すオブジェクトへの参照を失うと、shared_ptrメカニズムはオブジェクトを削除します。

scoped_ptr を使用できるのは、作成したスコープが残されたときに削除されるポインターだけである場合(例外、 goto のいずれかによって)外の場所へ、または通常の制御フローまたは他のメカニズムによって)。そのように使用する場合、shared_ptrに変更する必要はありません。

scoped_ptrとshared_ptr(およびauto_ptr)の違いは、主にコピーのセマンティクスです。

  • scoped_ptrは<!> quot; リソース割り当ては初期化です <!> quot;コピー可能ではありません(他のインスタンスと共有できず、所有権を譲渡できません)
  • shared_ptrは、複数のパーティ間で共有される場合のメモリの自動再生用です
  • auto_ptrはコピー可能です(割り当てられたときに所有権を譲渡します)

shared_ptrとscoped_ptrのもう1つの重要な違いは、shared_ptrのみがweak_ptrで動作することです。弱いポインターは共有ポインターのサイクルを中断するために使用され、それによってメモリリークを回避しますが、weak_ptrはそれ以上に使用できます。

共有ポインタと弱いポインタを使用して、所有参照と非所有参照の違いを表現できます。データの明確な所有権は、よりクリーンな設計につながります。したがって、可能であれば、shared_ptrを介して他のオブジェクトが 1つ所有する必要があります。データオブジェクトに対する他のすべての長期参照は、データの非所有権を表す弱いポインターである必要があります。所有していないモジュールがデータにアクセスするたびに、weak_ptrをshared_ptrに変換する必要があります。この時点で、データオブジェクトが存在しないことがわかります。ただし、非所有モジュールはデータオブジェクトにアクセスしている間、一時的なshared_ptrを介してデータオブジェクトを保持し、所有オブジェクトがデータを解放した場合でも安全な操作を保証します。

すでに回答したように、shared_ptrは共有所有権に関するものです。ただし、共有所有権は一般に悪いことであり(flyweightパターンなどの例外が存在する)、所有者を特定し、そこにscoped_ptrを配置することをお勧めします。

shared_ptrは、参照カウントを行うスマートポインタータイプです。オブジェクトの所有者が1人だけの場合(よくあるケース)、scoped_ptrが適切なソリューションです。オブジェクトをコードの複数の部分で共有できる場合、shared_ptrは、そのオブジェクトへのすべての参照が解放されるまでオブジェクトを破棄させません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top