2017-01-11 16 views
0
typedef boost::signals2::signal<void()> signal_t; 

class AAA { 

public: 

void Connect(const signal_t::slot_type& subscriber) 
{ 
    return m_sig.connect(subscriber); 
} 

void FireSignal() 
{ 
    m_sig(); 
} 

private: 

    signal_t sig; 
}; 

// Global 
AAA a; 

BBB b; 

// Some scope 
{ 
... 

a.Connect(boost::bind(&BBB:foo, &b)); 

... 
} 

以前のboost :: bindによって返された一時オブジェクトが有効範囲外になり、破棄されます ただし、一時オブジェクトは参照によってAAA :: Connectに渡されます。 ここで、ある時点でオブジェクトa.FireSignal()が呼び出されたとします。シグナルはすでに破棄されている関数オブジェクトを呼び出しますか?どうやってそれは動作するのですか?ブースト信号参照範囲外のオブジェクト?

答えて

0

それをコピーして保持します。

boost::bindにあなたの結果が格納slot_typeを構築するために訴えられているそのメンバーとして、また、それがsignal::connectに渡された後、あなたのbind結果のコピーを意味slot_typeは、signal内に格納された信号を格納し、これは、信号が発生したときに使用され呼び出されるものです。

私はこれがspecificalyとaxplicitly言われていますが、多かれ少なかれからと結論づけることができる場所を見つけることができません

+0

私が試しを両方とも参照渡しとオブジェクト渡しを使用します。ブースト信号2がクラッシュする!どういうわけか、信号はバインドによって作成された関数オブジェクトを失います。 – Joseph

+0

@Josephあなたが使用しているインスタンス( 'BBB b')はバインド結果自体よりも死んでいる可能性が高く、さらに別の理由があるかもしれません。本当にコンテキストに依存します。 – Drax

関連する問題