1
boost bind limitationsの意味を完全に理解していません。バインドは非POD引数で渡された値または参照を受け取りますか?
クラス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);
}
}
敬具、
これは、上記のコード例が安全であることを意味しますか?このように 'void DoIt(const std :: vector&v){}'をコード化するのは意味がありますか? –
@MasaoLiu、 'this'は十分に長くて安全です。 – SergeyA