Hi,
I'm trying to serialize an object of class X that has a member
boost::weak_ptr< X >. The weak pointer may as well be empty and the
object is still in valid state - at least in this context. The
serialization code, however, tries to make a shared_ptr out of the
weak_ptr, which throws a bad_weak_ptr when the weak_ptr is empty. Should
the weak_ptr be checked for expired() before trying to make a shared_ptr
of it?
Using boost 1.33.1 on Fedora Core 6, gcc 4.1.1, glibc 2.5, though the
platform should not matter here.
An example code demonstrating the problem follows:
#include <iostream>
#include <fstream>
#include
#include
#include
#include
class X
{
public:
template< typename Archive >
void serialize(Archive & ar, const unsigned int version)
{
ar & some_data;
ar & myFellowClassmate;
}
boost::weak_ptr< X > myFellowClassmate;
int some_data;
};
inline std::ostream& operator<<( std::ostream& os, const X& x )
{
return os << "x.some_data = " << x.some_data << std::endl;
}
using namespace std;
int main ( int argc, char* argv[] )
{
X x;
x.some_data = 1;
cout << x;
std::ofstream ofs("filename");
boost::archive::text_oarchive oa(ofs);
oa & x;
ofs.close();
std::ifstream ifs("filename", std::ios::binary);
boost::archive::text_iarchive ia(ifs);
x.some_data = 3;
cout << x;
ia & x;
cout << x; // should print out 'x.some_data = 1'
}