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. 我不想指定max_size. #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,但是这个 对于您的情况,您应该在使用后销毁缓冲区对象.这是解决问题的最简单方法.出于优化目的,您可以记住最后一个缓冲区大小,并通过将最后一个大小传递给构造函数来创建具有给定容您可以编写一个围绕此功能的包装器来实现可读代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |