2017-08-01 2 views
0

私は、次のしている:クラスCboost::signal2C++のshared_ptrのstd ::バインドとstd ::機能

クラスBリッスンをし、トリガークラスAによって与えられたコールバックを実行し、それはクラスのメソッドを実行しますA

ABCDはすべてstd::shared_ptrです。

問題は、クラスDがクラスBへのポインタを離したとき、Bが原因でシグナルハンドラの削除されていないことです。私がboost::connectionの切断を呼び出しても、私は同じ問題を抱えています。

どのように私はそれを修正することができますか?

+2

いくつかのコードを表示できますか? – Frank

+0

はい、これは、人々が内部的に何が起こっているのかを理解するための十分なコードなしでは使用できません。 –

+0

私はあなたが望むのは、シグナルハンドラのための['std :: weak_pointer'](http://en.cppreference.com/w/cpp/memory/weak_ptr)ですが、コードを持つことでこれをより簡単にすることに同意します理解する。 –

答えて

1

したがって、問題はshared_ptrサイクルに起因していました。クラスAは削除されませんされたよう

クラスAは、クラスBshared_ptrクラスAに保持しているstd::functionに渡しました。

例えば、

B.route(std::bind(&A::myFunc, shared_from_this()));私はラムダ関数やクラスAでのweak_ptrとそれを固定:

std::weak_ptr<A> wp = shared_from_this(); 
    A.route(std::bind([wp]() { 
    auto p = wp.lock(); 
    if(wp) 
    wp->myFunc(); 
})); 

その方法Aがまだ有効であるならば、私の機能myFuncだけと呼ばれています。

関連する問題