提升信号参考对象超出范围?

时间:2017-01-11 08:37:24

标签: c++ boost signals2

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()被调用,信号是否调用已被销毁的函数对象???它是如何工作的呢?

1 个答案:

答案 0 :(得分:0)

它会复制它并保留它。

boost::bind的结果会被用来构建slot_type,将其存储为成员,然后一旦传递给signal::connect,信号就会存储slot_type ,表示bind结果的副本存储在signal内,并且是信号触发时使用和调用的副本。

我无法找到一个特定的地方并明确地说,但你可以或多或少地从以下结论: