2016-08-27 16 views
0

私は後輩のコードを見直して、次のコードを見つけました。C++スレッドへの参照によるローカル変数の受け渡し

void ActionGetId(boost::property_tree::ptree& callInfo); 
void ActionPutId(boost::property_tree::ptree& callInfo); 

void handler(int type, std::string data) 
{ 
    boost::property_tree::ptree callInfo(data); 
    if(type == 0) 
    { 
     _ioService.post(boost::bind(&ActionGetId, callInfo); 
    } 
    else 
    { 
     _ioService.post(boost::bind(&ActionPutId, callInfo); 
    } 
} 

ローカル変数を参照渡ししてから、関数を終了します。これらの関数が最後に呼び出されると、ローカル変数が存在しない可能性があります。しかし、このプログラムはクラッシュしません。これはどのように機能していますか?

+2

_ "このプログラムはクラッシュしません。どのように機能していますか?"クラッシュしないということは、正しく動作するということではありません。未定義の動作は未定義です。 –

+0

'callinfo'はboost bindの中にコピーされます。 – Arunmu

+0

コードを簡略化して、何がスレッドに渡され、どのようにクリアされるのでしょうか? '_ioService.post'が何をするかは誰も知らない。 – juanchopanza

答えて

8

boost::bindは、与えた引数をコピーし、それが返す関数オブジェクトにコピーを格納します。関数が呼び出されると、(存在しなくなった)ローカル変数への参照ではなく、(まだ有効な)コピーへの参照に作用します。

あなたが実際に(あなたがここではしたくない)変数への参照を使用するようにboost::bindまたはstd::bindを望んでいた場合は、boost::ref(var)またはstd::ref(var)bindに変数を渡す必要があると思います。

+0

ああ、そうです。私は常にshared_ptrまたは値を渡して関数をバインドします。参照が異なる方法で処理されることを認識していませんでした。知っておいてよかった。ありがとう。 – Sharath

関連する問題