加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:33:17 所属栏目:百科 来源:网络整理
导读:boost :: asio :: streambuf大小将继续增加,直到调用consume(). 即使在调用consume()之后,底层缓冲区使用的内存也永远不会被释放. 例如:以下代码首先创建了一个streambuf而没有指定max_size. 然后它将14Mb数据转储到streambuf中. 然后它消耗所有这14MB数据.
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;
}

解决方法

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

>你是对的,缓冲区实现为std :: vector,但是这个
成员是私人的,没有任何访问者.
>消耗方法不触及此字段.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读