c++ - boost asio streambuf 在调用 consume 后不释放内存?

标签 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 的get 指针 之前的内存吗?

最佳答案

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)都会被重用,所以你不需要释放任何东西。

关于c++ - boost asio streambuf 在调用 consume 后不释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9552785/

相关文章:

c++ - Boost 计划选项示例

用于 getter 的 C++ 临界区

c++ - 在类中使用枚举时,它会是公开的吗?为什么?

c++ - 在 C++ 中初始化二维结构数组

c++ - 线程安全地关闭同步使用的 boost::asio::ip::tcp::socket

c++ - Boost::访问者运算符过载时的变体 "Error: no match for call to [...]"

c++ - 如何使用 Boost.Asio 的生成(堆栈协程),使其仅依赖于 Boost.Context?

c++ - 使用 boost::asio ssl 服务器减少每次连接的内存使用

php - 如何在使用 Boost C++(在共享区域中)编写的 php Web 应用程序中读取 map ?

sockets - 在 boost 套接字上设置选项 SO_SETFIB