2016-08-30 8 views
0

ソケットクラス(以下のコード)を書き込もうとしています。最後に、すべてで 作品:再接続、接続、メッセージを送信、メッセージがio_service :: runを使用しているときにメモリリークが発生する

を受け取るしかし、私はTCPSocketBodyを繰り返したときに、私はメモリリークを気づい::接続(のconstのstd ::文字列&住所、constのはstd ::文字列&ポート)のためであればホストの例は到達不能です。私のアプリケーションのサイズが増えています。

私が行削除したときにことを発見:

thread_io_service = boost::thread(boost::bind(&boost::asio::io_service::run, &io_service_global)); 

を、問題が消えます。しかし、私はこのラインが必要です。私が間違っていることは何ですか? 私は自分のアプリケーション内のスレッドのコマンドライン番号からチェックし、それは常に一定しにくい、ヘッダファイルがない場合、1または2

#include "TCPSocketBody.h" 

TCPSocketBody::TCPSocketBody() : socket_(io_service_global), 
           resolver(io_service_global), 
           connected(false), 
           expectedMessage(0) 
{ 

} 

void TCPSocketBody::Close() 
{ 
    io_service_global.post(boost::bind(&TCPSocketBody::DoClose, this)); 
} 

void TCPSocketBody::Connect(const std::string &adress, const std::string &port) 
{ 
    io_service_global.reset(); 
    iterator = resolver.resolve({adress, port}); 

    boost::asio::async_connect(socket_, iterator, 
      boost::bind(&TCPSocketBody::HandleConnect, this, 
      boost::asio::placeholders::error)); 


    socket_.set_option(boost::asio::ip::tcp::no_delay(true)); 

    thread_io_service = boost::thread(boost::bind(&boost::asio::io_service::run, &io_service_global)); 

} 

void TCPSocketBody::HandleConnect(const boost::system::error_code& error) 
{ 
    if (!error) 
    {   
     connected = true; 

     boost::asio::async_read(socket_, 
     boost::asio::buffer(data_to_read, MessageCoder::BufferSize()), boost::asio::transfer_all(), 
     boost::bind(&TCPSocketBody::HandleReadHeader, this, 
      boost::asio::placeholders::error)); 

    } else 
    { 
     Close(); 
    } 
} 

void TCPSocketBody::HandleReadHeader(const boost::system::error_code& error) 
{ 
    expectedMessage = MessageCoder::HeaderToVal(data_to_read); 

    if (expectedMessage > MessageCoder::MaxMessageSize()) 
    { 
     expectedMessage = 0; 
     Close(); 
    } else 
    { 
     boost::asio::async_read(socket_, 
      boost::asio::buffer(data_to_read, expectedMessage), boost::asio::transfer_all(), 
      boost::bind(&TCPSocketBody::HandleReadMessage, this, 
      boost::asio::placeholders::error)); 
    } 
} 

void TCPSocketBody::HandleReadMessage(const boost::system::error_code& error) 
{ 
    expectedMessage = 0;   

    boost::asio::async_read(socket_, 
     boost::asio::buffer(data_to_read, MessageCoder::BufferSize()), boost::asio::transfer_all(), 
     boost::bind(&TCPSocketBody::HandleReadHeader, this, 
     boost::asio::placeholders::error)); 
} 

void TCPSocketBody::WriteMessage(char *dataToSend) 
{ 
    io_service_global.post(boost::bind(&TCPSocketBody::Write, this, dataToSend)); 
} 

void TCPSocketBody::Write(char *dataToSend) 
{ 
    data = dataToSend; 

    boost::asio::async_write(socket_, 
     boost::asio::buffer(data, std::strlen(data)), 
     boost::bind(&TCPSocketBody::HandleWrite, this, 
      boost::asio::placeholders::error)); 

} 

void TCPSocketBody::HandleWrite(const boost::system::error_code& error) 
{ 
    if (!error) 
    { 

    } 
    else 
    { 
     Close(); 
    } 
} 

void TCPSocketBody::DoClose() 
{ 
    socket_.close(); 
    connected = false; 
} 

答えて

0

です。私はthread_io_serviceがメンバ変数であると思われます。 'Connect'への2回目の呼び出しでは、オブジェクトを破棄せずに既存の値を上書きします。オブジェクト内に割り当てられたメモリはすべてリークされます。

多分、thread_io_serviceのstd :: vectorを作成して、connect呼び出しで新しいスレッドをpush_backしようとしてください。ベクトルは、破壊されたときに格納されているオブジェクトを破壊します。

Valgrindは問題を詳細に特定できる可能性があります。

+0

これは機能します。ありがとう! –

+0

ようこそ。私の答えが役に立ったら、それを「受け入れてください」。私は私の評判を築こうとしています。あなたの助けに感謝します。 –

関連する問題