2016-11-07 10 views
0

私は共有ポインタインスタンスのために私自身のデストラクタを書く必要があります。残念なことに、そのようなインスタンスはライブラリ関数呼び出しから取得され、それを初期化するのではありません。だからここでデストラクタを "設定"することはできますか?既存の共有ポインタのためにDeleterを設定するには?

理想的には、私の心の中のコードは、私が最初に仮定するためのAPIを見つけられませんでした

pointer.setDeleter(myDeleter); 

または

pointer = std::make_shared<MyType>(pointerOld.get(), myDeleter); 

のように見えることがあります。 2つ目は、MyTypeには2つのパラメータを持つコンストラクタがありません。コンパイルできません。

これについてのご意見はありますか?

ありがとうございます!

+0

なぜこれが欲しいですか?おそらく、図書館はあなたが彼らのデリターを嫌っているとは思わないでしょう。 – GManNickG

+0

@GManNickGイベントベースメカニズムでライブラリを使用しているためです。したがって、私は、あるスレッド(つまり、イベントベースのスレッド)でDeleterを呼び出すようにします。それ以外の場合、Deleterはセグメント障害を導入します。 – zzy

+0

共有ポインタへの最後の参照を解放するときに呼び出される必要がありますか、またはソース共有ポインタの寿命を延ばす新しい共有ポインタ(独自の有効期間を持つ)を作成するだけで十分ですゼロになり、余分なコードが実行されますか? – Yakk

答えて

1

これは私が得ることができる最も近いものです。

template<class T> 
std::shared_ptr<T> extra_deleter(std::shared_ptr<T> in, std::function<void(T*)> action) { 
    if (!in) return {}; 
    if (!action) return std::move(in); 
    // action=std::move(action) in c++14 
    auto new_deleter = [action](std::shared_ptr<T>* tin) { 
     action(tin->get()); 
     delete tin; 
    }; 

    auto tmp = std::shared_ptr<std::shared_ptr<T>>(
    new shared_ptr<T>(std::move(in)), 
    std::move(new_deleter) 
); 
    if (!tmp) return {}; 
    // aliasing ctor: 
    return {tmp, tmp.get()->get()}; 
} 

これはポインタを共有共有ポインタを作成し、カスタム削除手段アクションでそれを補強し、これを実行するための余分なコードを起こさないT.

に共有ポインタを作成するために、エイリアシングのctorを使用していますソースshared_ptrが破壊されました。代わりに、追加の破棄コードを含む新しいshared_ptrを作成します。 shared_ptrという新しい系統が死亡すると、actionが実行されます。

元のshared_ptr状態が他に残っていない場合は、shared_ptrの元の駆逐艦が実行されます。

+0

申し訳ありませんが、私はあなたの考えを完全には理解できませんでした.C++ 11では比較的新しいです。この関数を呼び出す方法を教えてもらえますか?(特に、Deleterがクラスの非静的メンバー関数である場合(実際にはこれらすべてが1つのクラスにあります))?また、私は最後のリターンステートメントを理解していませんでした。なぜ、これらの2つのパラメータを**中かっこ**の中に入れるのですか? – zzy

+0

@zzyは '[](T * foo){std :: cout <<(void *)foo << '\ n';}'のように 'T *ポインタ値を出力する。最初の引数として 'shared_ptr 'を渡してください。これは、参照カウントが満了したときにアクションを呼び出す拡張共有ptrを返します。次に、ソースshared_ptrの参照カウントを放棄します。それは同じ「T」を指しています。 'return {a、b};'は 'a、b'で戻り値のctorを直接呼び出す方法です。元の共有ptr状態は変更されません。 – Yakk

関連する問題