2017-01-07 7 views
0

私はasync_writeでTCPを介してデータを送信するためにブーストを使用しています:これを削除すると、async_writeでセグメンテーション違反が発生する可能性がありますか?

std::shared_ptr<std::vector<std::string>::iterator> iter = std::make_shared<std::vector<std::string>::iterator>(this->m_vDataToWrite.begin());

boost::asio::async_write(this->socket_, boost::asio::buffer(*message), 
    boost::asio::transfer_all(), boost::bind(&Session::writeHandler, 
      this, boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred(), 
      message, 
      iter 
      )); 



    // ... 

    void Session::writeHandler(const boost::system::error_code &error, std::size_t bytes_transferred, std::shared_ptr<std::string> message, std::shared_ptr<std::vector<std::string>::iterator> it) 
    { 
     if(error) 
     { 
      std::cout << "Write handler error: " << error.message() << std::endl; 
      this->disconnect(); 
      delete this; 
      return; 
     } 
//.... 

お知らせ書き込みハンドラでdelete this;を。

データを送信中にエラーが発生した場合、セッションは接続を切断してから削除します。ただし、writeHandlerが返された後にセグメンテーション違反が発生します。 async_writeに取り込まれていますが、thisを削除している可能性がありますか?

+0

私は知っていますが、私は "my"コードでこれ以上アクセスしていません。ですから、 'writeHandler'が返った後、' async_write'によってアクセスされる可能性があると私は考えました。 – Bobface

答えて

1

あなたがdelete thisになると、オブジェクトへのアクセスはすべて無効になります。他の場所でポインタをコピー/キャプチャしても問題ありません。

+0

私の質問の下にあなたのコメントへの回答を書いた: \t 私は知っているが、私は "マイ"コードでそれ以上アクセスしていない。だから私はそれがasync_writeによってアクセスされる可能性があると思った、writeHandlerが – Bobface

+1

を返した後です。 'this :: 'はbind:' boost :: bind(&Session :: writeHandler、 this')でバインドされています。コード内でアクセスしていて、完了ハンドラによって非同期に実行されます。すべてのサンプルに見られるこのパターンを有効にしました。 – sehe

関連する問題