Ten Points Random » Programming https://blog.asdfa.net Too many monitors, dragons, interesting human interfaces and pointless distractions for one guy. Sun, 17 Mar 2013 04:43:30 +0000 en-US hourly 1 https://wordpress.org/?v=4.0.32 Using shared_from_this inside boost::serialization https://blog.asdfa.net/using-shared_from_this-inside-boostserialization/ https://blog.asdfa.net/using-shared_from_this-inside-boostserialization/#comments Sun, 02 Dec 2012 01:13:32 +0000 http://blog.asdfa.net/?p=305 Didn’t find a solution foe this on the Internet, so I thought I’d just write this up real quick to benefit anyone that was having the same issue.

If you are using boost::serialization and shared_ptr, you may have already discovered that all you have to do is add

#include <boost/serialization/shared_ptr.hpp>

to make them work together happily.

However, if your initialization routine inside your load requires shared_from_this, you may find yourself getting

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_weak_ptr> >'
  what():  tr1::bad_weak_ptr

when trying to call methods that require shared_from_this in s11n code.

This happens because a sahred_ptr hasn’t been created for yoru unserializing class yet. To work around this, define this macro:

//Extra to make shared_from_this available inside the saving code
//This works by asking the archive to handle (and therefore create) a shared_ptr for the data
//before the main serialization code runs.
#define ALLOW_SHARED_THIS(type) \
    template<class Archive> inline void load_construct_data(Archive &ar, type *obj, const unsigned int file_version) { \
        boost::shared_ptr<type> sharedPtr; \
        ::new(obj)type();/* create instance */ \
        ar.reset(sharedPtr, obj); /* Tell the archive to start managing a shared_ptr */ \
    }

Then use it for each class that needs the shared_from_this functionality:

namespace boost { namespace serialization {
ALLOW_SHARED_THIS(MyClass)
}}

This defines a custom constructor for your class that will create the shared_ptr for your instance before your main s11n code runs and allow your code to run peacefully.

 

]]>
https://blog.asdfa.net/using-shared_from_this-inside-boostserialization/feed/ 1