std::default_delete
を使用する代わりにカスタムの destroy-function を呼び出すことでstd::unique_ptr
、 s が破棄する必要のある型を簡単に管理できるように特化することができます。delete p;
オブジェクトがstd::shared_ptr
C++ でa によって管理されていることを確認するには、基本的に 2 つの方法があります。
std::make_shared
またはを使用して、共有ポインタによって管理されるように作成しますstd::allocate_shared
。これは、必要な両方のメモリ ブロック (ペイロードと参照カウント) を 1 つに結合するため、推奨される方法です。sしか残っていない場合std::weak_ptr
でも、参照カウントが必要なため、必然的にペイロード用のメモリも固定されます。その後、コンストラクターまたはを使用して、管理を共有ポインターに割り当てます
.reset()
。
2 番目のケースは、カスタムのデリータを提供しない場合に興味深いものです。
具体的には、配列に対してインスタンス化されているかどうかに応じて、delete [] p;
またはをそれぞれ使用する、指定されていないタイプの独自のデリータを使用するように定義されています。delete p;
std::shared_ptr
n4659 からの引用 (~C++17):
template<class Y> explicit shared_ptr(Y* p);
4 Requires:
Y
完全型でなければならない。式が配列型のdelete[] p
場合T
、または が配列型でないdelete p
場合、T
式は明確に定義された動作をし、例外をスローしません。
5 効果:T
が配列型でない場合shared_ptr
、ポインタを所有するオブジェクトを構築しますp
。それ以外の場合は、shared_ptr
を所有するp
と、 を呼び出す未指定の型の削除子を構築しますdelete[] p
。が配列型でない場合T
、 で有効shared_from_this
になりp
ます。例外がスローされた場合、が配列型でないdelete p
場合に呼び出され、それ以外の場合に呼び出されます。 6 事後条件: . […]T
delete[] p
use_count() == 1 && get() == p
template<class Y> void reset(Y* p);
3つの効果: と同等
shared_ptr(p).swap(*this)
。
私の質問は次のとおりです。
std::default_delete
代わりに使用するように指定されていない、できれば正当な理由はありますか?- 有効な (そして潜在的に有用な) コードは、その変更によって壊れますか?
- そうする提案はすでにありますか?