31

ここでの簡単な質問:boost::shared_ptr自分自身を明示的に削除することは許可されていますか? あなたは今までにすべきですか?

明確にするために、私は、によって保持されているポインターを削除するという意味ではありませんshared_ptr。私は実際shared_ptrそのものを意味しました。ほとんどの人がそれをしないように提案していることを知っているので、明示的に実行しても問題ないかどうか疑問に思っていました.

4

5 に答える 5

34

あなたの質問は明確ではありません。shared_ptrを動的に割り当てた場合は、必要なdeleteときにいつでも割り当てることができます。

しかし、 によって管理されているオブジェクトを削除することが許可されているかどうかを尋ねている場合shared_ptr、答えは ... 場合によります。true を返す場合shared_ptr::unique、呼び出すshared_ptr::resetと管理対象オブジェクトが削除されます。ただし、 false を返す場合は、そのオブジェクトの所有権を共有しshared_ptr::uniqueている が複数存在することを意味します。shared_ptrこの場合、 を呼び出すとreset参照カウントが 1 だけ減ります。オブジェクトの実際の削除は、そのオブジェクトを最後にshared_ptr管理していたものがスコープ外になるか、それ自体になったときに行われますreset

編集:
編集後、動的に割り当てられた を削除することについて質問しているようですshared_ptr。このようなもの:

auto sp = new boost::shared_ptr<int>( new int(42) );

// do something with sp

delete sp;

これは許可されており、期待どおりに機能しますが、これは通常とは異なるユース ケースです。唯一の注意点は、オブジェクトの割り当てと削除の間にオブジェクトの所有権を共有spする別のオブジェクトを作成した場合、削除してもオブジェクトが削除されないことです。これは、オブジェクトの参照カウントが 0 になった場合にのみ発生します。shared_ptrsp

于 2012-09-07T16:33:42.197 に答える
6

[編集:で作成されdeleteshared_ptr場合にのみ、new他のタイプと同じようにできます。shared_ptrなぜwith を作成するのかはわかりませんが、あなたをnew止めるものは何もありません。]

まあ、あなた書くことができますdelete ptr.get();

これを行うと、他の共有所有者がそれらshared_ptrを使用して削除されたオブジェクトにアクセスするか、オブジェクトの最後の所有者shared_ptrが破棄され、オブジェクトが再び削除されるときに、ほぼ必然的に未定義の動作が発生します。

いいえ、そうすべきではありません。

の目的はshared_ptr、所有権を共有する他のユーザーが存在する可能性があるため、削除する権利または責任を「人」が持たないオブジェクトを管理することです。したがって、あなたもしたくないはずです。

于 2012-09-07T16:34:43.917 に答える
3

参照カウントを強制的にゼロにすることはできません。

それが機能するために何が必要かを考えてください。shared_ptr が使用されている各場所に移動してクリアする必要があります。

共有ポインタを強制的に削除して NULL に設定した場合、weak_ptr のようになります。ただし、その shared_ptr を使用するコード内のすべての場所は、その準備ができておらず、有効なポインターを保持することを期待しています。NULL をチェックする理由がないため、これらのコードはクラッシュします。

于 2012-09-07T16:31:54.650 に答える