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 回答