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