std::shared_ptr
のカスタム・アロケータとカスタム・ディテクタの両方を同時に使用できますか? std::allocate_shared
はDeleterを取っていないので、そうする方法はないようです。また、削除者の賢明な署名は、void deleter(T*)
の代わりにvoid deleter(T*, const Alloc&)
のようなものになります。shared_ptrカスタム・アロケータとカスタム・ディテクタ
この制限を回避する方法はありますか?
std::shared_ptr
のカスタム・アロケータとカスタム・ディテクタの両方を同時に使用できますか? std::allocate_shared
はDeleterを取っていないので、そうする方法はないようです。また、削除者の賢明な署名は、void deleter(T*)
の代わりにvoid deleter(T*, const Alloc&)
のようなものになります。shared_ptrカスタム・アロケータとカスタム・ディテクタ
この制限を回避する方法はありますか?
はい、これは可能ですが、何が起こっているのかを必ず確認してください。デリターの目的はオブジェクトを破壊することです。アロケータは内部の帳簿構造に使用されます。
std::shared_ptr<T> sp(new T(args...), std::default_delete<T>(), myalloc);
make_shared
とallocate_shared
のポイントは、(彼らはあなたのためのオブジェクトを構築するの世話をので、あなたは彼らがリソースを取得した方法に適したです彼らは自分デリータを使用—デリータを指定していないということですすなわちそれぞれoperator new
と提供されたアロケータを介して)。
上記のコンストラクタに渡してアロケータ割り当てオブジェクトと一緒に渡し、アロケータ(または別のもの)を使用する独自のアロケータデリータ(this oneや1つのproposed hereなど)を作成することはもちろん可能です。簿記のために。
弱いポインタが長かったり、バイナリサイズの問題がある場合は、make_shared
/allocate_shared
を使用しないと言われることがあります。
個別のアロケータとデリータを使用できます。両方をとるコンストラクタはshared_ptr
です。
しかし、あなたはできませんこれを行うallocate_shared
でこれを行う。その理由は、アロケータが共有ストレージの割り当て/割り当て解除のためです。 Deleterは、管理対象のオブジェクトを破棄し、そのストレージを解放するためのものです。
allocate_shared
は、同じストレージにあるオブジェクトを、共有ストレージ自体として割り当てているため、2つの操作が別々のものではなくなりました。したがって、両方のプロセスで同じオブジェクトを使用する必要があります。アロケータは単一の割り当てを割り当て、割り当てを解除し、T
が作成および破棄されるための建設/破壊の任務を遂行します。