C++ boost::asio::streambuf收缩到合适的尺寸?

C++ boost::asio::streambuf收缩到合适的尺寸?,c++,boost,boost-asio,shrink,streambuf,C++,Boost,Boost Asio,Shrink,Streambuf,boost::asio::streambuf大小将持续增加,直到调用consume()为止。 即使在调用consume()之后,底层缓冲区使用的内存也永远不会释放。 例如:下面的代码首先创建了streambuf,但没有指定max_大小。 然后将14Mb的数据转储到streambuf中。 然后它会消耗所有这些14MB的数据。 在2000点,streambuf.size()为0,但“top”显示进程仍需要14MB内存 我不想指定最大大小。 在streambuf为空后,是否仍有收缩streambuf的

boost::asio::streambuf大小将持续增加,直到调用consume()为止。
即使在调用consume()之后,底层缓冲区使用的内存也永远不会释放。

例如:下面的代码首先创建了streambuf,但没有指定max_大小。 然后将14Mb的数据转储到streambuf中。 然后它会消耗所有这些14MB的数据。 在2000点,streambuf.size()为0,但“top”显示进程仍需要14MB内存

我不想指定最大大小。 在streambuf为空后,是否仍有收缩streambuf的方法

#include <boost/asio.hpp>
#include <iostream>
#include <string>

int main()
{
    {
        boost::asio::streambuf b;
        std::ostream os(&b);

        for(int i= 0; i<1000000; ++i)
        {
            os << "Hello, World!\n";
        }
        std::cout<<"point 1000"<<std::endl;
        std::cout<<"size="<<b.size()<<std::endl;
        // at this point, the streambuf's size is close to 14MB.


        b.consume(b.size());
        std::cout<<"point 2000"<<std::endl;
        std::cout<<"size="<<b.size()<<std::endl;
        // at this point, the streambuf.size() is 0
        // but the streambuf's underlying buffer, which is a vector I assume,
        // still hold that 14MB space.
        // "top" shows the process size is 14M


    }

    // at this point, "top" showed the process size shrinks to almost zero
    std::cout<<"point 4000"<<std::endl;
    return 0;
}
#包括
#包括
#包括
int main()
{
{
boost::asio::streambuf b;
标准:ostream操作系统和b;

对于(inti=0;iSo),我查看了来源,发现了两个观察结果

  • 您是对的,缓冲区是作为std::vector实现的,但是 成员是私有的,没有任何访问者

  • 消费方法不涉及此字段


  • 对于您的情况,您应该在使用后销毁缓冲区对象。这是解决问题的最简单方法。出于优化目的,您可以记住最后一个缓冲区大小,并通过将最后一个大小传递给构造函数来创建具有给定容量的新缓冲区。您可以围绕此功能编写包装,以实现可读代码。

    这非常类似r到,但这并不表示对您的问题的肯定回答。感谢您的确认。对于我的情况,不接受销毁和重建,这将比设置最大大小更糟糕。如果无法缩小它,我想我必须在其上设置最大大小。