2016-03-29 3 views
1

boost bind limitationsの意味を完全に理解していません。バインドは非POD引数で渡された値または参照を受け取りますか?

クラスcのインスタンスが構築され、そのメンバ関数start()がメインスレッド以外のスレッドによって呼び出されたとします。

私の次の理解が間違っている場合、私を修正してください:DoIt()はそのパラメータvから取得何

は、ベクトルの参照(つまり、アドレス)です。 DoIt()が変数vにアクセスするまでには、その内容はすでにf()が返された後で破棄することができます。したがって、コード

io_service.post(boost::bind(&c::DoIt,this,v); 

は安全でなく、プログラムがクラッシュする可能性があります。最初にvf()に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

bindは常に値によって、それの引数を取ります。これがstd::ref(およびboost::ref)が存在する理由の1つです。

+0

これは、上記のコード例が安全であることを意味しますか?このように 'void DoIt(const std :: vector &v){}'をコード化するのは意味がありますか? –

+0

@MasaoLiu、 'this'は十分に長くて安全です。 – SergeyA

関連する問題