2017-01-19 8 views
0

std::shared_ptrのカスタム・アロケータとカスタム・ディテクタの両方を同時に使用できますか? std::allocate_sharedはDeleterを取っていないので、そうする方法はないようです。また、削除者の賢明な署名は、void deleter(T*)の代わりにvoid deleter(T*, const Alloc&)のようなものになります。shared_ptrカスタム・アロケータとカスタム・ディテクタ

この制限を回避する方法はありますか?

答えて

2

はい、これは可能ですが、何が起こっているのかを必ず確認してください。デリターの目的はオブジェクトを破壊することです。アロケータは内部の帳簿構造に使用されます。

std::shared_ptr<T> sp(new T(args...), std::default_delete<T>(), myalloc); 

make_sharedallocate_sharedのポイントは、(彼らはあなたのためのオブジェクトを構築するの世話をので、あなたは彼らがリソースを取得した方法に適したです彼らは自分デリータを使用—デリータを指定していないということですすなわちそれぞれoperator newと提供されたアロケータを介して)。

上記のコンストラクタに渡してアロケータ割り当てオブジェクトと一緒に渡し、アロケータ(または別のもの)を使用する独自のアロケータデリータ(this oneや1つのproposed hereなど)を作成することはもちろん可能です。簿記のために。

弱いポインタが長かったり、バイナリサイズの問題がある場合は、make_shared/allocate_sharedを使用しないと言われることがあります。

1

個別のアロケータとデリータを使用できます。両方をとるコンストラクタはshared_ptrです。

しかし、あなたはできませんこれを行うallocate_sharedでこれを行う。その理由は、アロケータが共有ストレージの割り当て/割り当て解除のためです。 Deleterは、管理対象のオブジェクトを破棄し、そのストレージを解放するためのものです。

allocate_sharedは、同じストレージにあるオブジェクトを、共有ストレージ自体として割り当てているため、2つの操作が別々のものではなくなりました。したがって、両方のプロセスで同じオブジェクトを使用する必要があります。アロケータは単一の割り当てを割り当て、割り当てを解除し、Tが作成および破棄されるための建設/破壊の任務を遂行します。

関連する問題