提升asio streambuf在调用消耗后不释放内存?

时间:2012-03-04 06:13:35

标签: c++ boost 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被多次调用时,内存将会增长。我的用法是否正确?有没有办法在streambuf the get pointer之前释放记忆?

1 个答案:

答案 0 :(得分: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));
}

但是每次再次使用()和read()时,内部缓冲区(向量)都会被重用,所以你不需要发布任何内容。