boost asio streambuf не освобождает память после вызова потреблять?

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 стримбуф?

1 ответ

Решение

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 (), внутренний буфер (вектор) используется повторно, поэтому вам не нужно ничего освобождать.

Другие вопросы по тегам