45

私は多くのboost::shared_ptr<MyClass>オブジェクトを持っていますが、ある時点で、意図的deleteにそれらのいくつかにメモリを解放したいと考えています。(その時点で、指定されたMyClassオブジェクトはもう必要ないことがわかっています。) どうすればそれを行うことができますか?

delete()で取得した生のポインターで呼び出すことはできないと思いますget()

get_deleter(shared_ptr<T> const & p)で関数を見たことがありますがboost::shared_ptr、使い方がわかりません。また、すぐ横に実験的と書かれています。(私は Boost 1.38 を持っていると思います。)

たぶんboost::shared_ptr、変数に新しい空を割り当てるだけですか?古い値を破棄して削除する必要があります。

4

4 に答える 4

83

あなたはただする

ptr.reset();

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

shared_ptr<T>().swap(ptr)

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

Smart Pointer Programming Techniquesに興味があるかもしれません。遅延解放に関するエントリがあります。

于 2009-03-07T03:51:29.003 に答える
9

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

于 2009-08-07T08:49:09.953 に答える
8

の全体的なポイントは、 s がそれを指していないとき、つまり、このオブジェクトを最後に指していたものが範囲外になるか、別のオブジェクトを指すように再割り当てされたときに、指先オブジェクトが正確boost::shared_ptr<T>に削除されるということです。したがって、オブジェクトを削除するために必要なことは、それを指している sがないことを確認することだけです。たとえば、オブジェクトを指している呼び出しが 1 つしかない場合は、それをスコープ外にするか、呼び出し(プレーン ポインターの場合と同等) にするか、別のものを指すように割り当てます。shared_ptr<T>shared_ptr<T>shared_ptr<T>shared_ptr<T>pp.reset()p = NULL

オブジェクトを指している が 2 つある場合shared_ptr<T>は、両方を再割り当てする必要があります。

編集:p = NULL;実際には有効なコードではないことを指摘してくれたdehmannに感謝しshared_ptr<T>ます... :)

于 2009-03-07T03:55:20.693 に答える
4

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

于 2009-04-18T03:48:56.283 に答える