boost::signals
複数の信号を単一の信号に接続しようとすると、メモリを使用してリークしていslot_type
ます。これと同じリークがさまざまなフォーラムで報告されているのを見てきましたが、これを行う正しい方法や回避策について言及しているものは見つかりません。
私がやろうとしていること:
結果を関数に渡そうとしboost::bind()
ています。この関数では、その結果に複数の信号を接続したいと思います。最初の接続は正常に機能しますが、最初の接続以降のすべての接続でハンドルがリークします。
サンプルコードは次のとおりです。
typedef boost::signal0<void> LeakSignalType;
class CalledClass
{
/* ... */
void connectToSlots(LeakSignalType::slot_type &aSlot)
{
LeakSignalType *sig;
std::list<LeakSignalType*> sigList;
std::list<LeakSignalType*>::iterator sigIter;
for(int i = 0; i < 50; i++)
{
/*Connect signals to the passed slot */
sig = new LeakSignalType;
sig->connect(aSlot);
sigList.push_back(sig);
}
for(sigIter = sigList.begin(); sigIter != sigList.end(); sigIter++)
{
/* Undo everything we just did */
delete *sigIter;
}
sigList.clear();
/*Everything should be cleaned up now */
}
/* ... */
}
class CallingClass : public boost::signals::trackable
{
CalledClass calledInstance;
/* ... */
void boundFunction(int i)
{
/*Do Something*/
}
void connectSignals()
{
calledInstance.connectToSlots(boost::bind( &CallingClass::boundFunction, this, 1));
}
/* ... */
};
今すぐ呼び出しますCallingClass::connectSignals()
。
connectToSlots
の呼び出しにより、50個の信号が単一のスロットに接続され、それらの信号がすべて切断されてクリーンアップされることを期待しています。実際に発生するのは、1つの信号が完全にクリーンアップされ、残りの49の信号が部分的にクリーンアップされますが、一部のメモリがリークすることです。
スロットを関数に渡して複数回使用する正しい方法は何ですか?どんな助けでもいただければ幸いです。
ありがとう、クリス