Boost 信号引用对象超出范围?
Boost Signal References Object Out of Scope?
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
中,这是信号触发时使用和调用的结果。
我找不到明确明确说明这一点的地方,但你或多或少可以得出结论:
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
中,这是信号触发时使用和调用的结果。
我找不到明确明确说明这一点的地方,但你或多或少可以得出结论: