[boost::serialization]: Dies with access violation (segfaults) reading beyond the end of archive.

When 1) trying to restore from archive the pointer to sample class, and 2) archive is over at this moment boost::serialization causes Access Violation Fault in file: basic_iarchive.cpp, line 470: bpis_ptr = co.bpis_ptr; The code to reproduce the fault follows. -- Konstantin Andreev. ------------------------( cut here )---------------------- #include <iostream> #include <sstream> #include <boost/archive/text_iarchive.hpp> #include <boost/archive/text_oarchive.hpp> class Sample { private: int pod_int; std::string pod_str; template<class Archive> void serialize(Archive & ar, const unsigned int ){ ar & pod_int & pod_str; }; friend class boost::serialization::access; friend std::ostream & operator<<(std::ostream & os, const Sample & sa ); public: Sample() {}; Sample( int _i, std::string _s ) : pod_int( _i), pod_str( _s ) {}; }; BOOST_CLASS_TRACKING(Sample, track_never) BOOST_CLASS_VERSION(Sample, 19) std::ostream & operator<<(std::ostream & os, const Sample & sa ) { return os << "-- int: " << sa.pod_int << ", str: >" << sa.pod_str << "< at 0x " << &sa << '\n'; } int main( void ) { Sample *obj_to = NULL; const Sample * const obj_fr = new Sample( 55, "**** test string *****" ); std::cout << *obj_fr; std::stringstream archbuf; boost::archive::text_oarchive *oa = new boost::archive::text_oarchive( archbuf, 3 ); *oa << obj_fr; std::cout << "-- archive content: >" << archbuf.str() << "<\n"; delete oa; boost::archive::text_iarchive *ia = new boost::archive::text_iarchive( archbuf, 3 ); *ia >> obj_to; std::cout << *obj_to; /////////////////////////////////// *ia >> obj_to; // ARCHIVE IS OVER. BOOM !!! /////////////////////////////////// std::cout << *obj_to; delete ia; return 0; }

Konstantin Andreev wrote: Make the following change: int main( void ) { Sample *obj_to = NULL; const Sample * const obj_fr = new Sample( 55, "**** test string *****" ); std::cout << *obj_fr; std::stringstream archbuf; boost::archive::text_oarchive *oa = new boost::archive::text_oarchive( archbuf, 3 ); *oa << obj_fr; std::cout << "-- archive content: >" << archbuf.str() << "<\n"; archbuf.flush(); // make this change delete oa; boost::archive::text_iarchive *ia = new boost::archive::text_iarchive( archbuf, 3 ); *ia >> obj_to; std::cout << *obj_to; /////////////////////////////////// *ia >> obj_to; // ARCHIVE IS OVER. BOOM !!! /////////////////////////////////// std::cout << *obj_to; delete ia; return 0; }

"Robert Ramey" <ramey@rrsd.com> wrote: news:eeka26$30v$1@sea.gmane.org...
Make the following change:
*oa << obj_fr; std::cout << "-- archive content: >" << archbuf.str() << "<\n"; archbuf.flush(); // make this change
This change had no effect.
delete oa;
boost::archive::text_iarchive *ia = new boost::archive::text_iarchive( archbuf, 3 ); *ia >> obj_to; std::cout << *obj_to;
*ia >> obj_to; // ARCHIVE IS OVER. BOOM !!!
participants (2)
-
Konstantin Andreev
-
Robert Ramey