boost :: asio :: streambuf收缩适合?

时间:2012-11-06 04:16:01

标签: c++ boost boost-asio shrink streambuf

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

例如:以下代码首先创建了一个streambuf而没有指定max_size。 然后它将14Mb数据转储到streambuf中。 然后它消耗所有这14MB数据。 在第2000点,streambuf.size()为0,但“top”表示该过程仍需要14MB RAM。

我不想指定max_size。 无论如何在空白后收缩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;
}

1 个答案:

答案 0 :(得分:2)

所以,我查看了消息来源,我看到了两个观察结果。

  1. 你是对的,缓冲区实现为std :: vector,但是这个 成员是私人的,没有任何访问者。

  2. 消费方法不会触及此字段。

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