(または他のスマート ポインター)を使用するとstd::shared_ptr
、ctor を介してカスタム アロケーター/デリータが割り当てられることに気付きました。これはたまたまテンプレートです。私の質問は次のとおりです。アロケータ/デリータはどのように保存および使用されますか?
これらのファンクターは、関数ポインター、void*
または何として格納されますか? 間接呼び出しですか、それとも直接呼び出しですか。
私が尋ねようとしていることをより明確に理解するために、次のコードを検討してください。
struct SomethingAwesomeDeleter
{
public:
void operator()(SomethingAwesome* ptr) const
{
// do something awesome
delete ptr;
}
};
typedef std::shared_ptr<SomethingAwesome> SomethingAwesomePtr;
SomethingAwesomePtr ptr{new SomethingAwesome, SomethingAwesomeDeleter{}};
SomethingAwesomeDeleter{}
保管・使用方法は?
注:std::shared_ptr
がテンプレート クラスである
ことは認識std::shared_ptr
していますが、クラス テンプレート引数にデリータ/アロケータのテンプレート引数がありません。つまり、 のようなテンプレート クラスはありませんstd::shared_ptr<T, Allocator, Deleter>
。