boost :: shared_ptrを意図的に削除する方法は?
-
05-07-2019 - |
質問
多くのboost::shared_ptr<MyClass>
オブジェクトがあり、ある時点で意図的にdelete
いくつかのメモリを解放する必要があります。 (その時点で、ポイントされたMyClass
オブジェクトはもう必要ないことを知っています。)どうすればそれができますか?
delete()
で取得した生のポインタでget()
を呼び出すことはできないと思います。
get_deleter(shared_ptr<T> const & p)
で関数boost::shared_ptr
を見ましたが、使用方法がわかりません。また、そのすぐ横に experimental と表示されます。 (私はBoost 1.38を持っていると思います。)
新しい空の<=>を変数に割り当てるだけですか?これにより、古い値が破棄されて削除されます。
解決
やるだけ
ptr.reset();
shared_ptrマニュアルを参照してください。それは同等です
shared_ptr<T>().swap(ptr)
オブジェクトを参照しないスマートポインターごとにreset
を呼び出します。このような最後の<=>(または実際に参照カウントがゼロになる他のアクション)により、オブジェクトは削除機能を使用して自動的に解放されます。
スマートポインタープログラミング手法。 遅延割り当て解除に関するエントリがあります。
他のヒント
オブジェクトを意図的に削除できるようにしたい場合(私は常に行います)、単一の所有権を使用する必要があります。 shared_ptrが設計に適していない場合、使用することに魅了されています。
boost::shared_ptr<T>
のポイントは、shared_ptr<T>
sがポイントしていない時点、つまり最後のp
がポイントされた時点で、ポインティオブジェクトが正確に削除されることですこのオブジェクトがスコープ外になるか、別のオブジェクトを指すように再割り当てされます。したがって、オブジェクトを削除するために必要なことは、それを指しているp.reset()
がないことを確認することだけです。例えば。オブジェクトを指すp = NULL
という単一のp = NULL;
のみがある場合は、オブジェクトをスコープ外にするか、<=>(プレーンポインターの<=>と同等)を呼び出すか、何かを指すように割り当てます。その他。
オブジェクトを指す2つの<=>がある場合は、両方を再割り当てする必要があります。
編集: <=>は実際には<=> ...の有効なコードではないことを指摘してくれたdehmannに感謝します:)
やりたいことは、 boostを使用して弱い参照を返すことです。 :: weak_ptr 。必要に応じてshared_ptrに変換できます。これにより、shared_ptr内のオブジェクトの存続期間を制御でき、それにアクセスしたいオブジェクトはweak_ptrを保持し、shared_ptrへの変換を試みることができます。その変換が失敗した場合、再クエリしてオブジェクトをメモリに戻すことができます。