我不完全理解boost bind limitations提到的含义。
想象一下,构造了一个类c
的实例,其成员函数start()
由主线程以外的线程调用。
如果我的理解有误,请纠正我:
DoIt()
从参数v
得到的是向量的引用(即地址)。
当DoIt()
访问变量v
时,f()
返回后其内容可能已被销毁。因此,代码
io_service.post(boost::bind(&c::DoIt,this,v);
不安全,程序可能崩溃。我应该首先将v
中的f()
序列化为std :: string并将其作为参数传递给bind()
,然后更改DoIt()
以将std :: string作为参数。
class c
{
boost::asio::io_service io_service;
void DoIt(std::vector<int> v){
std::cout << v.size() << std::endl;
}
void start(){
io_service.run();
}
void f(){
std::vector<int> v;
v.push_back(1);
v.push_back(2);
io_service.post(boost::bind(&c::DoIt,this,v);
}
}
致以最诚挚的问候,
答案 0 :(得分:0)
bind
总是按值来获取它的参数。这是std::ref
(和boost::ref
)确实存在的原因之一。