#include #include #include #include #include #include // シリアライズ対象のクラス群(ここから) struct Base1 { virtual ~Base1() {} // serialize friend class boost::serialization::access; template void serialize(Archive &/*ar*/, const unsigned int /* file_version */) { } }; struct Base2 { virtual ~Base2() {} // serialize friend class boost::serialization::access; template void serialize(Archive &/*ar*/, const unsigned int /* file_version */) { } }; struct Sub:Base1, Base2 { virtual ~Sub() {} // serialize friend class boost::serialization::access; template void serialize(Archive &ar, const unsigned int /* file_version */) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base1); ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base2); } }; // この中で、型情報が、メタ情報として登録される BOOST_CLASS_EXPORT(Sub) // シリアライズ対象のクラス群(ここまで) // 問題の箇所をピンポイントで再現するためのテストコード void test() { // 生のポインタ // iarchiveから、読み込んだ状況を想定 Sub *pSub = new Sub; Base2 *pBase2 = pSub; // 空のshared_ptr // 生のポインタの関係と対応する形で、 // 共有(shared)状態を作り出しつつ、構築される必要がある boost::shared_ptr spSub; boost::shared_ptr spBase2; // shared_ptr_helperを直接利用 boost::archive::detail::shared_ptr_helper sh; assert(pSub == pBase2); void *pvSub = pSub; void *pvBase2 = pBase2; assert(pvSub == sh.object_identifier(pBase2)); sh.reset(spSub, pSub); sh.reset(spBase2, pBase2); assert(spSub.get() == pSub); // success assert(spBase2.get() == pBase2); // fail } int main() { test(); }