boost asio streambuf не освобождает память после вызова потреблять? - PullRequest
4 голосов
/ 04 марта 2012
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 pointer streambuf?

1 Ответ

4 голосов
/ 04 марта 2012

asio :: streambuf основан на std :: vector, который растет по мере необходимости, но никогда не сжимается.Итак, потребление () не должно освобождать память, оно просто настраивает внутренние указатели:

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));
}

Но каждый раз, когда вы снова используете () и read (), внутренний буфер (вектор) используется повторно, поэтомувам не нужно ничего выпускать.

...