shared_ptrチェーン/ブランチと2番目のデリゲーター

shared_ptrのユーザーがいつ完了したか、つまりユーザーが最終的にすべてのコピーをリリースしたときを知る必要がある状況があります。通常、ここではデリターを使用していますが、この場合は小さなキャッチがあります。基礎となるオブジェクトはすでにshared_ptrです!

すなわち、擬似コードでは:

shared_ptr a( new T );
.
.
.
shared_ptr b( a, bind( delete_func, id ) );

私は元のshared_ptrから新しいブランチを作り出しています。この新しいshared_ptr b は通常のshared_ptrのようにコピーして使用できますが、この特定の分岐が完了したときにdelete_funcを呼び出す必要があります。今度は、この新しいshared_ptrに基底のオブジェクトも保持する必要があるので(これは最後のshared_ptrかもしれません)、ここで a.get()を使用することはできません。

私は大幅にフレームワークを変更することなくこれを行うためのいくつかの方法を探しています。誰かが良いシンプルなソリューションを見ていますか?

スマートポインタとバインド用のブーストライブラリを使用しています。

1

2 答え

私は可能な解決策を思いついた。

次のようなDeleter関数を作成します:

void delete_func( int id, shared_ptr underlying );

次にshared_ptrをチェーンするには、次のようにします:

shared_ptr b( a.get(), bind( &delete_func, id, a ) );

これにより、カスタムのDeleter(myブランチ)を持つ新しい未接続のshared_ptrが作成されます。パラメータの1つが元のshared_ptrであるため、これも基礎となるshared_ptrオブジェクトを維持する必要があります。今私はちょっとこれをテストする必要があります。

0
追加された
@visitor、それはまさに望むものです。本質的に b は独自のライフタイムを持つことになっています。
追加された 著者 edA-qa mort-ora-y,
b の最後のコピーが有効範囲外になったときに、これはDeleterを呼び出さないでしょうか。 a のコピーはその時点で有効範囲内にある可能性があります。 - 最初に作成されたカスタムのデリターを a に追加するだけではいかがですか?
追加された 著者 visitor,

なぜあなたに shared_ptr の2つの別々のレイヤーを持たせたいのか分かりませんが、あなたに通知する適切なデリターを用意して、ポインタの checked_deleter ?そうすれば、単一のDeleterしか必要なくなり、 shared_ptr1つの Deleterを提供するという単純な問題に戻ります。

0
追加された
a は内部モジュールの一部であると考えてください。関数が呼び出され、 a にもアクセスする必要がありますが、システムは、この外部呼び出し元がそれを使用して完了したことをシステムが認識しなければなりません。したがって、 a はそれを知らないので直接返すことはできません。したがって、何らかの形で変数のこの新しいコピーの存続期間にフックする必要があります。
追加された 著者 edA-qa mort-ora-y,