5

std::default_delete を使用する代わりにカスタムの destroy-function を呼び出すことでstd::unique_ptr、 s が破棄する必要のある型を簡単に管理できるように特化することができます。delete p;

オブジェクトがstd::shared_ptrC++ でa によって管理されていることを確認するには、基本的に 2 つの方法があります。

  1. std::make_sharedまたはを使用して、共有ポインタによって管理されるように作成しますstd::allocate_shared。これは、必要な両方のメモリ ブロック (ペイロードと参照カウント) を 1 つに結合するため、推奨される方法です。sしか残っていない場合std::weak_ptrでも、参照カウントが必要なため、必然的にペイロード用のメモリも固定されます。

  2. その後、コンストラクターまたはを使用して、管理を共有ポインターに割り当てます.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 事後条件: . […]Tdelete[] p
use_count() == 1 && get() == p

template<class Y> void reset(Y* p);

3つの効果: と同等shared_ptr(p).swap(*this)

私の質問は次のとおりです。

  1. std::default_delete代わりに使用するように指定されていない、できれば正当な理由はありますか?
  2. 有効な (そして潜在的に有用な) コードは、その変更によって壊れますか?
  3. そうする提案はすでにありますか?
4

1 に答える 1