Hi all, 

I run into a memory issue when uses boost wave library. My application runs as a service that parses c files. In each individual run, it calls in the wave library through a sub-function call to process one file. I noticed that some memory is not released from wave after each run. The consequence is that the memory usage of the application keeps increasing till the system breaks down. 

I could reproduce the problem with a simple modification of the quick_start sample code shipped with the boost wave library. (attached below).

My system is win64 and I see the problem with both 1.49 and 1.55. (built with b2 toolset=msvc-11.0 address-model=64 --build-type=complete)

Something I found during the investigation:
* The problem is gone if I build the application with link<static>. (Unfortunately, this is not an option for me)
* From the memory usage pattern, it seems that there is a memory pool in place that should have been released after each turn.
When repeatedly passing a 4MB file, the memory usage (taken from task maneger) is: 99,700K, 198,404K, 395,404K, 395408K, and 789,396K.
When running with static link, the memory usage after each run is: 1800K, 2480K, 2480K, .... The maximum usage is 8300K.

Is there any workaround with the problem?

Thanks,
Yong

------------------------------------- begin of the code ---------------------------------------------------

#define BOOST_WAVE_SERIALIZATION        0             // enable serialization
#define BOOST_WAVE_BINARY_SERIALIZATION 0             // use binary archives
#define BOOST_WAVE_XML_SERIALIZATION    1             // use XML archives
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//  Include Wave itself
#include <boost/wave.hpp>
///////////////////////////////////////////////////////////////////////////////
// Include the lexer stuff
#include <boost/wave/cpplexer/cpp_lex_token.hpp>    // token class
#include <boost/wave/cpplexer/cpp_lex_iterator.hpp> // lexer class
// sub-function that calls into wave
int do_it(std::string filename) {
    boost::wave::util::file_position_type current_position;
    std::ifstream instream(filename);
    std::string instring;
    instream.unsetf(std::ios::skipws);
    instring = std::string(std::istreambuf_iterator<char>(instream.rdbuf()),
                                std::istreambuf_iterator<char>());
    typedef boost::wave::cpplexer::lex_token<> token_type;
    typedef boost::wave::cpplexer::lex_iterator<token_type> lex_iterator_type;
    typedef boost::wave::context<std::string::iterator, lex_iterator_type> context_type;
    typedef boost::wave::cpplexer::lex_token<> TokenType;   
    typedef boost::wave::cpplexer::lex_iterator<TokenType> LexIterator;
    LexIterator aIter(instring.begin(), instring.end(),
    TokenType::position_type(
        filename.c_str()),
        boost::wave::language_support(
            boost::wave::support_cpp
            | boost::wave::support_option_long_long
        )
    );
    LexIterator endIter;
    for (; aIter != endIter; )  {
        (*aIter).get_value();
        ++aIter;
    }
    return 0;
}
int main(int argc, char *argv[])
{
    int aNum = 1;
    for (;;) {   
        do_it("c:\\memleak.txt");   
        std::cout << "Process the file again (0/1)? \n";
        scanf("%d", &aNum);
        if (aNum == 0) {
            printf("\nYou entered zero so we stop!\n");
            return 0;
        }   
    }   
    return 0;
}