2012-03-04 59 views
4
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的the get pointer之前有什么方法可以释放内存吗?boost asio streambuf在调用消耗后不释放内存?

+0

抱歉,错字:) – user869210 2012-03-04 06:20:47

+0

最有可能的是,你实际上已经释放它。内存将因碎片等原因而增长,一旦遇到高峰负载,内存就会开始平衡。 – 2012-03-04 06:23:35

回答

4

asio :: streambuf基于std :: vector,根据需要增长,但永远不会缩小。 因此,消费()不应该释放内存,它只是调整内部指针:

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)); 
} 

但每次你消耗时间(),并再次阅读(),内部缓冲器(矢量)被再利用,所以你不需要发布任何东西。

相关问题