4
boost::asio::streambuf b;
...
void handler(const boost::system::error_code& e, std::size_t size)
{
  if (!e)
  {
    std::stringstream sstr(std::string((std::istreambuf_iterator<char>(&b)), 
        std::istreambuf_iterator<char>()));
    b.consume(size);
    ...
  }
}
...
boost::asio::async_read_until(s, b, "END\r\n", handler);

メソッドが呼び出されたとき、consume占有されていたメモリstreambuf bは解放されません。async_read_until何度も呼び出されるとメモリが増えていきます。私の使い方は正しいですか?the get pointerstreambufの前にメモリを解放する方法はありますか?

4

1 に答える 1

4

asio::streambufはstd::vectorに基づいており、必要に応じて拡大しますが、縮小することはありません。したがって、consume()はメモリを解放することは想定されておらず、内部ポインタを調整するだけです。

void consume(std::size_t n)
{
  if (egptr() < pptr())
    setg(&buffer_[0], gptr(), pptr());
  if (gptr() + n > pptr())
    n = pptr() - gptr();
  gbump(static_cast<int>(n));
}

ただし、consume()とread()を再度実行するたびに、内部バッファー(ベクトル)が再利用されるため、何も解放する必要はありません。

于 2012-03-04T09:54:34.197 に答える