4

私は自分のコードでboost::scoped_ptrを多用していますが、それは素晴らしいことですが、現在、どこでもshared_ptrを使用するソフトウェアを使用しており、何かが足りないのではないかと思っています。

Shared_ptrは、異なるスレッドが同じデータにアクセスする予定であり、スレッドが終了する順序がわからない場合にのみ役立ちます(shared_ptrを使用すると、最後のスレッドが終了するまでオブジェクトが存在することが保証されます)。

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

4

6 に答える 6

7

AFAIK a shared_ptrは、異なるスレッドが同じデータにアクセスする場合にのみ役立ちます

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

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

于 2008-12-05T14:54:19.120 に答える
7

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

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

使用しているオブジェクトが同じスレッドにあるか異なるスレッドにあるかは問題ではありません。オブジェクトがすべて同じスレッドにある場合でも、オブジェクトの寿命は予測できません。

于 2008-12-05T15:06:49.610 に答える
2

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

  • scoped_ptr は「Resource Allocation Is Initialization」用であり、コピーできません (他のインスタンスと共有できず、所有権を譲渡できません)
  • shared_ptr は、複数のパーティ間で共有されている場合のメモリの自動再利用用です
  • auto_ptr はコピー可能です (割り当てられたときに所有権を譲渡します)
于 2009-04-18T03:58:37.087 に答える
2

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

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

于 2011-07-19T01:26:28.497 に答える
1

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

于 2008-12-05T17:54:46.387 に答える