2017-10-25 5 views
0

ASIOライブラリを使用することを学んでおり、非同期読み取り後にカスタムハンドラを開始しようとしています。ASIO(C++ 11)strand.postは、プライベートメンバー関数を使用するとセグメンテーション違反の原因となる

void myConnection::start() 
{ 
    conSocket.async_read_some(asio::buffer(conIOBuf), 
     [this](const std::error_code error, std::size_t length) 
     { 
      std::cout << "LOG: Starting Callback\n"; 
      myQStrand.post(
       [this, &error] 
       { 
        pushToMyQ(privateQ, error); 
       }); 
     }); 
} 

私はそれを実行したときしかし、私はコード内のpushToMyQラインでセグメンテーションフォールトを取得し、実行可能ファイルをデバッグするGDBを使用しました。私はerrorとprivateQの両方をチェックしました。彼らは両方とも有効なアドレスを持っていて、メンバ関数が呼ばれたときに動作します。

myConnectionは、完全に仮想の親クラスの子であり、他のクラスとの間で名前とアクセサの一部を一定に保ちます。 privateQは、キューをプライベートメンバーとして保持するmyConnectionへの参照によって渡すマネージャクラスによって保持されます。

pushToMyQが実行されている行のラムダでセグメンテーションフォルトが発生する原因は何ですか?

+1

(周囲のコードが表示されていないので、我々が知ることができない)、非同期タスクが実行される時点では生きていけないかもしれない、thisのコピーを保持します。しかし、おそらく 'myQStrand'や' privateQ'のような呼び出されたオブジェクトのどれかで生涯にわたる問題があると思われます。今考えてみましょう。内側のラムダが呼び出されるまでに 'error'が範囲外になっている可能性があります。 –

+0

どのようにしてスコープ内に留まるようにすることができますか? – scholarhedge

+0

'error'が唯一の問題であれば、おそらく参照ではなく値で取り込むことができます。しかし、唯一の問題ではないかもしれません。あなたが投稿したものではわかりません。 –

答えて

1

ローカル(error)への参照を非同期タスクに渡します。それはまずいです。

非同期タスクもこの質問は[MCVE]を必要

関連する問題