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 (), вызывает ли сигнал объект функции, который уже уничтожен ??? Как это работает иначе ???
Он делает копию и хранит ее.
Результат вашего к boost::bind
предъявлено обвинение, чтобы построить slot_type
который хранит это как член, а затем, как только он передается signal::connect
сигнал хранит slot_type
, что означает копию вашего bind
результат хранится в signal
и это тот, который используется и вызывается при срабатывании сигнала.
Я не могу найти место, где это конкретно и прямо сказано, но вы можете более или менее сделать вывод из:
Других решений пока нет …