Boost logo

Boost Users :

From: Mikko Vainio (mivainio_at_[hidden])
Date: 2006-04-10 09:20:35


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


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