|
Boost Users : |
From: Mikko Vainio (mivainio_at_[hidden])
Date: 2006-04-11 05:40:59
Dear Sirs,
Does anyone have a working example of serialization of shared_ptrs with
non-default deleter and factory construction as described in
http://www.boost.org/libs/smart_ptr/sp_techniques.html#preventing_delete ?
The code below (correctly) triggers error in boost/checked_delete.hpp
because the destructor of class X is private.
#include <iostream>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/export.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/shared_ptr.hpp>
class X
{
private:
~X();
class deleter;
friend class deleter;
class deleter
{
public:
void operator()(X * p) { delete p; }
};
friend class boost::serialization::access;
template< typename Archive >
void serialize(Archive & ar, const unsigned int version)
{
ar & some_data;
}
public:
static boost::shared_ptr<X> create()
{
boost::shared_ptr<X> px(new X, X::deleter());
return px;
}
int some_data;
};
inline std::ostream& operator<<( std::ostream& os, const X& x )
{
return os << "x = " << x.some_data << std::endl;
}
using namespace std;
int main ( int argc, char* argv[] )
{
boost::shared_ptr<X> x = X::create();
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;
}
I'm using boost 1.33.1 and gcc 4.0.1 on linux.
Any help on this is greatly appreciated.
Thanking in advance,
Mikko Vainio
-- :: Mikko Vainio <mikko.vainio_at_[hidden]> tel + 358 2 215 4600 :: Structural Bioinformatics Laboratory :: Department of Biochemistry and Pharmacy :: Abo Akademi University, Tykistokatu 6A, FI-20520 Turku Finland
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net