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