
Hello, The code below works fine in 1_33, but throws a bad_alloc exception after some 10-20K iterations in 1_34_0. Am I doing something wrong? Did the API or usage requirements change? Thanks, Jeff --------------------------------------------------------------------------------------------------------------------------------------- #include <iostream> #include <fstream> #include <sstream> #include <string> #include <boost/iostreams/filtering_stream.hpp> #include <boost/iostreams/copy.hpp> #include <boost/iostreams/filter/zlib.hpp> #include <boost/iostreams/device/array.hpp> #include <boost/iostreams/stream.hpp> #include <boost/iostreams/filtering_streambuf.hpp> bool binaryFile2String(const std::string& filename, std::string& out) { std::ifstream is(filename.c_str(), std::ios_base::in|std::ios_base::binary); if ( is.bad() || is.fail() ) return false; is.seekg(0,std::ios::end); const std::ios::pos_type len(is.tellg()); if ( len > out.max_size() ) return false; out.reserve(len); is.seekg(0, std::ios::beg); std::ostringstream os; os << is.rdbuf(); if ( ! is && ! is.eof() ) return false; out = os.str(); is.close(); return true; } int main(int argc, char** argv) { const char* inFileName = "/tmp/car.xml"; // put your data file here int loops(20000); if ( argc > 1 ) loops = atoi(argv[1]); std::string stringData; if ( ! binaryFile2String(inFileName,stringData) ) { std::cerr<<"Failed reading file "<<inFileName<<" into string"<<std::endl; exit(1); } register int i(0); try { for (i=loops; i > 0; --i) { if ( 0 == (i % 1000) ) std::cerr<<' '<<i; std::istringstream ifs(stringData); std::ostringstream toFS; boost::iostreams::filtering_ostream ofs; // this line causing the bad_alloc exception ofs.push(boost::iostreams::zlib_compressor()); ofs.push(toFS); boost::iostreams::copy(ifs,ofs); ofs.reset(); } } catch(const std::exception& e) { std::cerr<<"\nCaught std::exception on iteration "<<i<<": "<<e.what()<<std::endl; } if ( 0 == i ) { std::cerr<<"\nTEST OK on "<<loops<<" iterations"<<std::endl; } else { std::cerr<<"\nTEST FAILED on iteration "<<i<<std::endl; } return 0; }