Boost logo

Boost Users :

From: Robert Ramey (ramey_at_[hidden])
Date: 2008-05-22 12:42:06


This can't work.

load a pointer creates a new pointer with a copy of the original object.

adding the following to your test should make this clear

...
std::cout << "ref: " << *m.ref << std::endl;
...
 std::cout << "ref: " << *m2.ref << std::endl;

Robert Ramey

Bernhard Maeder wrote:
> Hello all
>
> I'm trying to serialize a std::map along with some pointers that are
> referencing onto some of the Value elements of that map. What I see
> now, is that those references are not loaded correctly. Here's what I
> do:
>
> #include <sstream>
> #include <boost/archive/text_oarchive.hpp>
> #include <boost/archive/text_iarchive.hpp>
> #include <boost/serialization/map.hpp>
>
> struct dummy
> {
> template<typename Archive>
> void serialize(Archive & ar, const unsigned int version)
> {
> }
> };
>
> struct map_ref_test
> {
> std::map<std::size_t, dummy> m;
> dummy * ref;
>
> template<typename Archive>
> void serialize(Archive & ar, const unsigned int version)
> {
> ar & m;
> ar & ref;
> }
> };
>
> int main()
> {
> std::ostringstream os;
>
> map_ref_test m;
> m.m[0] = dummy();
> m.m[1] = dummy();
> m.m[2] = dummy();
> m.ref = &(m.m[1]);
>
> // serialize
> boost::archive::text_oarchive out(os);
> out << const_cast<map_ref_test const &>(m);
>
> // De-serialize
> map_ref_test m2;
> std::string ser = os.str();
> std::istringstream is(ser);
> boost::archive::text_iarchive in(is);
>
> in >> m2;
>
> std::cout << "0: " << &m.m[0] << std::endl;
> std::cout << "1: " << &m.m[1] << std::endl;
> std::cout << "2: " << &m.m[2] << std::endl;
> std::cout << "ref: " << m.ref << std::endl;
>
> std::cout << "0: " << &m2.m[0] << std::endl;
> std::cout << "1: " << &m2.m[1] << std::endl;
> std::cout << "2: " << &m2.m[2] << std::endl;
> std::cout << "ref: " << m2.ref << std::endl;
> }
>
> This creates the following output:
>
> 0: 0x805bfc4
> 1: 0x805bfe4
> 2: 0x805c004
> ref: 0x805bfe4
> 0: 0x805ca04
> 1: 0x805ca24
> 2: 0x805ca44
> ref: 0xbfacad5c
>
> I'd expect the last line to read:
>
> ref: 0x805ca24
>
> So, what am I doing wrong? Should this even work?
>
> BTW: I'm using Boost 1.33.1
>
> Thanks a lot!
> Bernhard


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