ここでの簡単な質問:boost::shared_ptr
自分自身を明示的に削除することは許可されていますか? あなたは今までにすべきですか?
明確にするために、私は、によって保持されているポインターを削除するという意味ではありませんshared_ptr
。私は実際shared_ptr
そのものを意味しました。ほとんどの人がそれをしないように提案していることを知っているので、明示的に実行しても問題ないかどうか疑問に思っていました.
ここでの簡単な質問:boost::shared_ptr
自分自身を明示的に削除することは許可されていますか? あなたは今までにすべきですか?
明確にするために、私は、によって保持されているポインターを削除するという意味ではありませんshared_ptr
。私は実際shared_ptr
そのものを意味しました。ほとんどの人がそれをしないように提案していることを知っているので、明示的に実行しても問題ないかどうか疑問に思っていました.
あなたの質問は明確ではありません。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_ptr
sp
[編集:で作成されdelete
たshared_ptr
場合にのみ、new
他のタイプと同じようにできます。shared_ptr
なぜwith を作成するのかはわかりませんが、あなたをnew
止めるものは何もありません。]
まあ、あなたは書くことができますdelete ptr.get();
。
これを行うと、他の共有所有者がそれらshared_ptr
を使用して削除されたオブジェクトにアクセスするか、オブジェクトの最後の所有者shared_ptr
が破棄され、オブジェクトが再び削除されるときに、ほぼ必然的に未定義の動作が発生します。
いいえ、そうすべきではありません。
の目的はshared_ptr
、所有権を共有する他のユーザーが存在する可能性があるため、削除する権利または責任を「人」が持たないオブジェクトを管理することです。したがって、あなたもしたくないはずです。
参照カウントを強制的にゼロにすることはできません。
それが機能するために何が必要かを考えてください。shared_ptr が使用されている各場所に移動してクリアする必要があります。
共有ポインタを強制的に削除して NULL に設定した場合、weak_ptr のようになります。ただし、その shared_ptr を使用するコード内のすべての場所は、その準備ができておらず、有効なポインターを保持することを期待しています。NULL をチェックする理由がないため、これらのコードはクラッシュします。