【问题标题】:boost asio streambuf don't release memory after calling consume?boost asio streambuf在调用consume后不释放内存?
【发布时间】:2012-03-22 02:33:31
【问题描述】:
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之前的内存吗?

【问题讨论】:

  • 很可能,您实际上是在释放它。由于碎片等原因,内存会增长,然后在经历峰值负载后开始趋于平稳。

标签: c++ boost boost-asio streambuf


【解决方案1】:

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()时,内部缓冲区(vector)都会被重用,所以不需要释放任何东西。

【讨论】:

    猜你喜欢
    • 2018-04-09
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多