[1.34.0][serialization][iostreams] Memory leaks

The attached code works fine with version 1.33.1 but generates memory leaks with 1.34.0. Not sure it's a bug in Serialization or Iostreams. Compiler: Visual Studio 2005 SP1 Thanks, Ying http://www.lw-works.com - Clipboard Recorder #include <cstdlib> //#include <boost/array.hpp> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> //#include <boost/serialization/deque.hpp> #include <boost/iostreams/categories.hpp> #include <boost/iostreams/filter/zlib.hpp> #include <boost/iostreams/filtering_stream.hpp> #include <boost/iostreams/concepts.hpp> // sink, source #include <boost/iostreams/stream.hpp> #include <vector> #if _MSC_VER # ifdef _DEBUG # include <crtdbg.h> # ifndef new # define new new(_NORMAL_BLOCK, __FILE__, __LINE__) # endif # ifndef malloc # define malloc(size) _malloc_dbg(size, _NORMAL_BLOCK, __FILE__, __LINE__) # endif # endif #endif namespace cmn{ namespace iostreams{ template<typename Container> class container_sink { public: typedef typename Container::value_type char_type; typedef boost::iostreams::sink_tag category; container_sink(Container& container) : container_(container) { } std::streamsize write(const char_type* s, std::streamsize n) { container_.insert(container_.end(), s, s + n); return n; } Container& container() { return container_; } private: Container& container_; }; // class container_sink }} // namespace cmn::iostreams namespace cmn{ namespace iostreams{ template<typename Container> class container_source { public: typedef typename Container::value_type char_type; typedef boost::iostreams::source_tag category; container_source(Container& container) : container_(container), pos_(0) { } std::streamsize read(char_type* s, std::streamsize n) { using namespace std; streamsize amt = static_cast<streamsize>(container_.size() - pos_); streamsize result = (min)(n, amt); if (result != 0) { std::copy( container_.begin() + pos_, container_.begin() + pos_ + result, s ); pos_ += result; return result; } else { return -1; // EOF } } Container& container() { return container_; } private: typedef typename Container::size_type size_type; Container& container_; size_type pos_; }; // class container_source }} // namespace cmn::iostreams namespace cmn{ template<class T, class Container> bool compress_object(Container& v, const T& o) { typedef cmn::iostreams::container_sink<Container> sink; boost::iostreams::stream<sink> outs(v); boost::iostreams::filtering_stream<boost::iostreams::output> fs; fs.push(boost::iostreams::zlib_compressor()); fs.push(outs); boost::archive::text_oarchive oa(fs); oa << o; return true; } template<class T, class Container> bool decompress_object(const Container& v, T& o) { //ASSERT(v.size()); if(!v.size()) return false; typedef cmn::iostreams::container_source<const Container> source; boost::iostreams::stream<source> ins(v); boost::iostreams::filtering_stream<boost::iostreams::input> fs; fs.push(boost::iostreams::zlib_decompressor()); fs.push(ins); boost::archive::text_iarchive ia(fs); ia >> o; return true; } } // namespace cmn int main() { _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | /*_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_CHECK_CRT_DF | */_CRTDBG_LEAK_CHECK_DF); std::string data; std::vector<char> buf; cmn::compress_object(buf, data); cmn::decompress_object(buf, data); return 0; }

Ying wrote:
The attached code works fine with version 1.33.1 but generates memory leaks with 1.34.0.
Not sure it's a bug in Serialization or Iostreams.
There is a known bug in the 1.34.0 release that results in a memory leak. I believe that the corrected code was applied in CVS some time ago now and is just awaiting release as part of 1.34.1.

At 6:04 PM +0800 7/6/07, Ying wrote:
The attached code works fine with version 1.33.1 but generates memory leaks with 1.34.0.
Not sure it's a bug in Serialization or Iostreams.
There was a leak with iostreams zlib that was fixed in 1.33.1. That fix was unfortunately not merged into HEAD before 1.34.0 was branched, but has been merged onto both HEAD (for 1.35?) and the release branch for 1.34.1. See Trac ticket #971.
participants (3)
-
Christopher Woods
-
Kim Barrett
-
Ying