std::bind和boost::signals2一起使用安全吗?

Is it safe to use std::bind with boost::signals2?

本文关键字:安全 signals2 bind boost std 一起      更新时间:2023-10-16

使用std::bind传递成员函数给boost::signals2::signal::connect()是否安全?换句话说,boost::bind和std::bind可以互换吗?

它可以用vc++ 2010 SP1编译,但是模板代码超出了我的理解范围,我担心我可能会冒险进入未定义的行为领域。

我在这个主题上没有经验,我希望connect采取任何实现有效函数调用操作符的东西。使用任何与签名匹配的函数或函数对象调用它都应该是安全的,无论是boost::bind、std::bind还是其他任何东西。Boost库被设计成通用的,所以它们通常不会去挑选彼此的实现细节。

connect函数接受一个boost::function对象,该对象基本上是对任何具有为其定义的operator()的通用包装器。因此,它与您所绑定的内容一样安全。

例如:

boost::shared_ptr<ClassName> pValue = boost::make_shared<ClassName>(...);
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...);

这是相当安全的,因为它存储了一个boost::shared_ptr作为其数据的一部分。

ClassName *pValue = new ClassName(...);
signal.connect(boost::bind(&ClassName::FuncName, pValue, ...);

这是有条件安全的。如果该连接仍然存在并且您执行delete pValue,则立即变得不安全。

就我个人而言,我不太相信"有条件安全",但这取决于你。关键是,绑定到boost::bind的所有内容必须在绑定期间继续存在。