web-dev-qa-db-ja.com

boost :: shared_ptrを意図的に削除する方法は?

多くの_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_を変数に割り当てるだけですか?これにより、古い値が破棄されて削除されます。

45
Frank

あなたはただやる

ptr.reset();

shared_ptrマニュアル を参照してください。それは同等です

shared_ptr<T>().swap(ptr)

オブジェクトを参照しないすべてのスマートポインターでresetを呼び出します。そのような最後のreset(または実際に参照カウントがゼロになる他のアクション)により、オブジェクトは削除機能を使用して自動的に解放されます。

多分あなたは Smart Pointer Programming Techniques に興味があります。 遅延割り当て解除 に関するエントリがあります。

オブジェクトを意図的に削除できるようにしたい場合(私は常にそうします)、単一の所有権を使用する必要があります。 shared_ptrが設計に適していない場合、使用することに魅了されています。

9
John Morrison

_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に感謝します。

8
j_random_hacker

あなたがしたいのは、 boost :: weak_ptr を使用して弱い参照を返すことです。これは必要に応じてshared_ptrに変換できます。これにより、shared_ptr内のオブジェクトの存続期間を制御でき、それにアクセスしたいオブジェクトはweak_ptrを保持し、shared_ptrへの変換を試みることができます。その変換が失敗した場合、再クエリを実行してオブジェクトをメモリに戻すことができます。

4
chrish