If someone could help me diagnose this segmentation fault, I'd appreciate it greatly. It has stumped me for
a couple of days. I'm deserializing a non-polymorphic derived class, and Boost crashes when it attempts to
process the base class: Here is the pseudocode:
struct Base {
int id_;
std::string long_name_;
template<Archive>
void serialize(Archive & ar, const unsigned int file_version) {
ar & BOOST_SERIALIZATION_NVP(id_);
ar & BOOST_SERIALIZATION_NVP(long_name_);
// SEGFAULT OCCURS HERE
}
}
struct Derived : public Base
{
template<Archive>
void serialize(Archive & ar, const unsigned int file_version) {
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
…
}
}
for exporting the derived class using BOOST_CLASS_EXPORT, but none of them affected the segfault. I guess that it isn't really necessary
to export non-polymorphic derived classes.
Anyway, the code crashes in archive/basic_xml_iarchive.hpp in this code at line 92:
// Anything not an attribute - see below - should be a name value
// pair and be processed here
typedef detail::common_iarchive<Archive> detail_common_iarchive;
template<class T>
void load_override(
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
const
#endif
boost::serialization::nvp< T > & t,
int
){
this->This()->load_start(t.name());
this->detail_common_iarchive::load_override(t.value(), 0);
// SEGFAULT OCCURS HERE
this->This()->load_end(t.name());
}
In GDB, "this" has a valid address ( 0x7fffffffdb30) as does "t" (0x7ffffff487b0). In GDB, executing
t.name() yielded the correct name "long_name_", but when executing t.value(), the debugger
complained about an invalid address:
RuntimeError: Cannot access memory at address 0xffffffffffffffe8
That error message comes from GDB's Python utility for pretty-printing strings (the variable being deserialized is a std::string),
which is invoked when I print t.value(), but regardless something is wrong in t.value().
Does any of this suggest what I might be doing wrong? Thanks for any help.