2012-11-06 5 views
4

boost :: asio :: streambuf 크기는 consume()이 호출 될 때까지 계속 증가합니다.
consume()이 호출 된 후에도 기본 버퍼에 사용 된 메모리가 절대로 릴리스되지 않습니다.
boost :: asio :: streambuf shrink-to-fit?

예 : 다음 코드는 max_size를 지정하지 않고 streambuf를 처음 만들었습니다. 그런 다음 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; 
} 
+0

이것은 http://stackoverflow.com/questions/9552785/boost-asio-streambuf-dont-release-memory-after-calling-consume과 매우 유사하지만 질문에 대한 긍정적 인 대답을 나타내지는 않습니다. – Steve

답변

2

따라서 소스를 살펴보면 두 가지 관찰이 나에게 나타납니다. 자네 말이 맞아

  1. 는, 버퍼는 표준 : : 벡터로 구현하지만,이 회원은 개인이며 어떤 접근을하지 가지고있다.

  2. 소비 방법이 필드를 만지지 않습니다.

귀하의 경우, 소비 후 버퍼 객체를 파괴해야합니다. 그것은 문제를 해결하는 가장 쉬운 방법입니다. 최적화를 위해 마지막 버퍼 크기를 기억하고 생성자에 마지막 크기를 전달하여 지정된 용량으로 새 버퍼를 만들 수 있습니다. 읽을 수있는 코드를 만들기 위해이 기능을 둘러싼 래퍼를 작성할 수 있습니다.

+0

확인해 주셔서 감사합니다. 내 경우에는 destruct와 reconstruct가 허용되지 않는다. 그것은 max_size를 설정하는 것보다 더 나쁠 것이다. 음, 축소 할 방법이 없다면 max_size를 설정해야 할 것입니다. –