クライアントからデータを読み取るサーバーを作成し、データの読み取りにboost::asio async_read_someを使用しています。1つのハンドラー関数を作成しました。ここで_ioService->poll()はイベント処理ループを実行して、準備ができたハンドラーを実行します。ハンドラー _handleAsyncReceive では、receiveDataAsync で割り当てられた buf の割り当てを解除しています。bufferSize は 500 です。コードは次のとおりです。
bool
TCPSocket::receiveDataAsync( unsigned int bufferSize )
{
char *buf = new char[bufferSize + 1];
try
{
_tcpSocket->async_read_some( boost::asio::buffer( (void*)buf, bufferSize ),
boost::bind(&TCPSocket::_handleAsyncReceive,
this,
buf,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred) );
_ioService->poll();
}
catch (std::exception& e)
{
LOG_ERROR("Error Receiving Data Asynchronously");
LOG_ERROR( e.what() );
delete [] buf;
return false;
}
//we dont delete buf here as it will be deleted by callback _handleAsyncReceive
return true;
}
void
TCPSocket::_handleAsyncReceive(char *buf, const boost::system::error_code& ec, size_t size)
{
if(ec)
{
LOG_ERROR ("Error occurred while sending data Asynchronously.");
LOG_ERROR ( ec.message() );
}
else if ( size > 0 )
{
buf[size] = '\0';
LOG_DEBUG("Deleting Buffer");
emit _asyncDataReceivedSignal( QString::fromLocal8Bit( buf ) );
}
delete [] buf;
}
ここでの問題は、バッファが割り当て解除と比較してはるかに速い速度で割り当てられるため、メモリ使用量が指数関数的に高くなり、ある時点ですべてのメモリを消費し、システムが動かなくなることです。CPU 使用率も約 90% になります。メモリと CPU の消費を減らすにはどうすればよいですか?