CRASH:分段错误:Boost序列化加载-使用null调用构造函数

Juaxix

我正在使用C ++ Boost库1.6.3将游戏的主类序列化并保存到文本文件,该游戏的主类内部具有作为指针和引用,数组和基本类型变量的附加类,问题是当我加载文件时,它崩溃后显示以下输出:

Assertion failed: register_type(bpis_ptr->get_basic_serializer()) == cid, file libs\serialization\src\basic_iarchive.cpp, line 454

问题是该类与序列化的其他类相似,并且它们没有错误。

要进行序列化,这是我在按照boost :: serialization指令执行的操作:1)在基类中:添加用于进行序列化访问的friend类,以及用于序列化的函数,例如:

class BJShoe 
{
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int file_version)
    {
        ar & BOOST_SERIALIZATION_NVP(totalCards);
        ar & BOOST_SERIALIZATION_NVP(cards);
        ar & BOOST_SERIALIZATION_NVP(numCards);
    }
    protected:
    int totalCards[10],
        cards[10],
        numCards;
}

因此,对于主类,我有类似以下内容:

class Game {
    int numDecks;
    bool hitSoft17;
    bool doubleAnyTotal;
    bool double9;
    bool doubleSoft;
    bool doubleAfterHit;
    bool doubleAfterSplit;
    bool resplit;
    bool resplitAces;
    bool lateSurrender;
    int dealerSpeed;
    BJStrategy maxValueStrategy;
    Progress progress;
    // Release all objects on exit
    BJRules *rules;
    Player *strategy;
    Hand *dealer;
    Probabilities *dealerProbabilities;
    Shoe *shoe;
    BJShoe *distribution;
    PlayerHand *tempHand;
    //counters and game-loop vars
    int lastWager;
    int balance;
    Card tempCard;
    PlayerHand playerHands[4];
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive &ar, const unsigned int version)
    {
        ar.template register_type<BJShoe*>();
        ar.template register_type<PlayerHand*>();
        //etc.
        ar.template register_type<BJShoe>();
        ar.template register_type<PlayerHand>();
        cout << "numDecks\n";
        ar & BOOST_SERIALIZATION_NVP(numDecks);
        cout << "hitSoft17\n";
        ar & BOOST_SERIALIZATION_NVP(hitSoft17);
        cout << "doubleAnyTotal\n";
        ar & BOOST_SERIALIZATION_NVP(doubleAnyTotal);
        cout << "double9\n";
        ar & BOOST_SERIALIZATION_NVP(double9);
        cout << "doubleSoft\n";
        ar & BOOST_SERIALIZATION_NVP(doubleSoft); 
        cout << "doubleAfterHit\n";
        ar & BOOST_SERIALIZATION_NVP(doubleAfterHit); 
        cout << "doubleAfterSplit\n";
        ar & BOOST_SERIALIZATION_NVP(doubleAfterSplit);
        cout << "resplit\n";
        ar & BOOST_SERIALIZATION_NVP(resplit); 
        cout << "resplitAces\n";
        ar & BOOST_SERIALIZATION_NVP(resplitAces);
        cout << "lateSurrender\n";
        ar & BOOST_SERIALIZATION_NVP(lateSurrender); 
        cout << "dealerSpeed\n";
        ar & BOOST_SERIALIZATION_NVP(dealerSpeed);
        cout << "maxValueStrategy\n";
        ar & BOOST_SERIALIZATION_NVP(maxValueStrategy); 
        cout << "progress\n";
        ar & BOOST_SERIALIZATION_NVP(progress);
        cout << "rules\n";
        ar & BOOST_SERIALIZATION_NVP(rules); 
        cout << "strategy\n";
        ar & BOOST_SERIALIZATION_NVP(strategy);
        cout << "dealer\n";
        ar & BOOST_SERIALIZATION_NVP(dealer); 
        cout << "dealerProbabilities\n";
        ar & BOOST_SERIALIZATION_NVP(dealerProbabilities);
        cout << "shoe\n";
        ar & BOOST_SERIALIZATION_NVP(shoe); 
        cout << "distribution\n";
        ar & BOOST_SERIALIZATION_NVP(distribution);
        cout << "tempHand\n";
        ar & BOOST_SERIALIZATION_NVP(tempHand);     
        cout << "lastWager\n";
        ar & BOOST_SERIALIZATION_NVP(lastWager);
        cout << "balance\n";
        ar & BOOST_SERIALIZATION_NVP(balance);
        cout << "tempCard\n";
        ar & BOOST_SERIALIZATION_NVP(tempCard); 

        /*for (int i = 0; i < 4; i++) {
            ar & BOOST_SERIALIZATION_NVP(playerHands[i]);
            cout << "playerHands["<<i<<"]\n";
        }*/
        ar & BOOST_SERIALIZATION_NVP(playerHands);
        cout << "playerHands\n";
    }
}   

2)在子类中,执行与(1)相同的操作,并添加base_object函数,例如从BJShoe继承的Shoe的示例:

boost::serialization::base_object<BJShoe>(*this);

3)导出cpp中的类,例如:

BOOST_CLASS_EXPORT(Shoe)
BOOST_CLASS_EXPORT(BJShoe)

4)功能保存

void Game::save(const char* filename)
{
    ofstream ofs(filename);
    if (!ofs.good()) return;
    text_oarchive oa(ofs);
    //register all the classes, example:
    oa.register_type<Shoe>();
    oa.register_type<BJShoe>();
    oa.register_type<Game>();
    oa << boost::serialization::make_nvp("game",instance);
    ofs.close();
}

5)函数加载:

void Game::load(const char* filename)
{
    ifstream ifs(filename);
    if (!ifs.good()) return;
    text_iarchive ia(ifs);
   //register all the classes, example:
    ia.register_type<Shoe>();
    ia.register_type<BJShoe>();
    ia.register_type<Game>();       
    ia >> boost::serialization::make_nvp("game",instance);
    ifs.close();
}

6)调用save(“ play.data”); load(“ play.data”); 导致程序崩溃,这是日志:

./bj play
numDecks
hitSoft17
doubleAnyTotal
double9
doubleSoft
doubleAfterHit
doubleAfterSplit
resplit
resplitAces
lateSurrender
dealerSpeed
maxValueStrategy
progress
rules
strategy
dealer
dealerProbabilities
shoe
distribution
Segmentation fault
[jbelon@localhost cpp]$ gdb ./bj
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-94.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /var/www/html/blackjack/cpp/bj...done.
(gdb) run play
Starting program: /var/www/html/blackjack/cpp/./bj play
numDecks
hitSoft17
doubleAnyTotal
double9
doubleSoft
doubleAfterHit
doubleAfterSplit
resplit
resplitAces
lateSurrender
dealerSpeed
maxValueStrategy
progress
rules
strategy
dealer
dealerProbabilities
shoe
distribution

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7bad05c in boost::archive::detail::basic_iarchive_impl::load_preamble (this=0x6bd4c0, ar=..., co=...) at libs/serialization/src/basic_iarchive.cpp:319
319             if(co.bis_ptr->class_info()){
(gdb) backtrace
#0  0x00007ffff7bad05c in boost::archive::detail::basic_iarchive_impl::load_preamble (this=0x6bd4c0, ar=..., co=...) at libs/serialization/src/basic_iarchive.cpp:319
#1  0x00007ffff7bae132 in boost::archive::detail::basic_iarchive_impl::load_pointer (this=0x6bd4c0, ar=..., t=@0x6bdcb8: 0x6bd790,
    bpis_ptr=0x6b7190 <boost::serialization::singleton<boost::archive::detail::pointer_iserializer<boost::archive::text_iarchive, BJShoe> >::get_instance()::t>, finder=<optimized out>)
    at libs/serialization/src/basic_iarchive.cpp:446
#2  0x0000000000457063 in boost::archive::detail::load_pointer_type<boost::archive::text_iarchive>::invoke<BJShoe*> (ar=..., t=@0x6bdcb8: 0x6bd790)
    at /usr/include/boost/archive/detail/iserializer.hpp:524
#3  0x0000000000456484 in boost::archive::load<boost::archive::text_iarchive, BJShoe*> (ar=..., t=@0x6bdcb8: 0x6bd790) at /usr/include/boost/archive/detail/iserializer.hpp:592
#4  0x000000000045609e in boost::archive::detail::common_iarchive<boost::archive::text_iarchive>::load_override<BJShoe*> (this=0x7fffffffdb80, t=@0x6bdcb8: 0x6bd790)
    at /usr/include/boost/archive/detail/common_iarchive.hpp:66
#5  0x0000000000455bab in boost::archive::basic_text_iarchive<boost::archive::text_iarchive>::load_override<BJShoe*> (this=0x7fffffffdb80, t=@0x6bdcb8: 0x6bd790)
    at /usr/include/boost/archive/basic_text_iarchive.hpp:65
#6  0x00000000004558ff in boost::archive::text_iarchive_impl<boost::archive::text_iarchive>::load_override<BJShoe*> (this=0x7fffffffdb80, t=@0x6bdcb8: 0x6bd790)
    at /usr/include/boost/archive/text_iarchive.hpp:82
#7  0x00000000004555c0 in boost::archive::detail::interface_iarchive<boost::archive::text_iarchive>::operator>><BJShoe*> (this=0x7fffffffdb80, t=@0x6bdcb8: 0x6bd790)
    at /usr/include/boost/archive/detail/interface_iarchive.hpp:60
#8  0x0000000000455209 in boost::serialization::nvp<BJShoe*>::load<boost::archive::text_iarchive> (this=0x7fffffffd000, ar=...) at /usr/include/boost/serialization/nvp.hpp:87
#9  0x0000000000454d72 in boost::serialization::access::member_load<boost::archive::text_iarchive, boost::serialization::nvp<BJShoe*> > (ar=..., t=..., file_version=0)
    at /usr/include/boost/serialization/access.hpp:101
#10 0x0000000000454889 in boost::serialization::detail::member_loader<boost::archive::text_iarchive, boost::serialization::nvp<BJShoe*> >::invoke (ar=..., t=..., file_version=0)
    at /usr/include/boost/serialization/split_member.hpp:54
#11 0x0000000000454345 in boost::serialization::split_member<boost::archive::text_iarchive, boost::serialization::nvp<BJShoe*> > (ar=..., t=..., file_version=0)
    at /usr/include/boost/serialization/split_member.hpp:69
#12 0x0000000000453ce5 in boost::serialization::nvp<BJShoe*>::serialize<boost::archive::text_iarchive> (this=0x7fffffffd000, ar=..., file_version=0)
    at /usr/include/boost/serialization/nvp.hpp:89
#13 0x00000000004536c2 in boost::serialization::access::serialize<boost::archive::text_iarchive, boost::serialization::nvp<BJShoe*> > (ar=..., t=..., file_version=0)
    at /usr/include/boost/serialization/access.hpp:118
#14 0x00000000004530dc in boost::serialization::serialize<boost::archive::text_iarchive, boost::serialization::nvp<BJShoe*> > (ar=..., t=..., file_version=0)
    at /usr/include/boost/serialization/serialization.hpp:69
#15 0x0000000000452a49 in boost::serialization::serialize_adl<boost::archive::text_iarchive, boost::serialization::nvp<BJShoe*> > (ar=..., t=..., file_version=0)
    at /usr/include/boost/serialization/serialization.hpp:128
#16 0x00000000004522b1 in boost::archive::detail::load_non_pointer_type<boost::archive::text_iarchive>::load_only::invoke<boost::serialization::nvp<BJShoe*> > (ar=..., t=...)
    at /usr/include/boost/archive/detail/iserializer.hpp:373
#17 0x0000000000451a32 in boost::archive::detail::load_non_pointer_type<boost::archive::text_iarchive>::invoke<boost::serialization::nvp<BJShoe*> const> (ar=..., t=...)
    at /usr/include/boost/archive/detail/iserializer.hpp:439
#18 0x000000000045111f in boost::archive::load<boost::archive::text_iarchive, boost::serialization::nvp<BJShoe*> const> (ar=..., t=...)
    at /usr/include/boost/archive/detail/iserializer.hpp:592
#19 0x000000000045099e in boost::archive::detail::common_iarchive<boost::archive::text_iarchive>::load_override<boost::serialization::nvp<BJShoe*> const> (this=0x7fffffffdb80, t=...)
    at /usr/include/boost/archive/detail/common_iarchive.hpp:66
#20 0x00000000004503d5 in boost::archive::basic_text_iarchive<boost::archive::text_iarchive>::load_override<boost::serialization::nvp<BJShoe*> const> (this=0x7fffffffdb80, t=...)
    at /usr/include/boost/archive/basic_text_iarchive.hpp:65
#21 0x000000000044fdab in boost::archive::text_iarchive_impl<boost::archive::text_iarchive>::load_override<boost::serialization::nvp<BJShoe*> const> (this=0x7fffffffdb80, t=...)
    at /usr/include/boost/archive/text_iarchive.hpp:82
#22 0x000000000044f6f0 in boost::archive::detail::interface_iarchive<boost::archive::text_iarchive>::operator>><boost::serialization::nvp<BJShoe*> const> (this=0x7fffffffdb80, t=...)
    at /usr/include/boost/archive/detail/interface_iarchive.hpp:60
#23 0x000000000044e2d3 in boost::archive::detail::interface_iarchive<boost::archive::text_iarchive>::operator&<boost::serialization::nvp<BJShoe*> const> (this=0x7fffffffdb80, t=...)
    at /usr/include/boost/archive/detail/interface_iarchive.hpp:67
#24 0x000000000044cc31 in Game::serialize<boost::archive::text_iarchive> (this=0x6bdc60, ar=..., version=1) at Game.h:271
#25 0x000000000044aeee in boost::serialization::access::serialize<boost::archive::text_iarchive, Game> (ar=..., t=..., file_version=1) at /usr/include/boost/serialization/access.hpp:118
#26 0x0000000000449f6b in boost::serialization::serialize<boost::archive::text_iarchive, Game> (ar=..., t=..., file_version=1) at /usr/include/boost/serialization/serialization.hpp:69
#27 0x0000000000447364 in boost::serialization::serialize_adl<boost::archive::text_iarchive, Game> (ar=..., t=..., file_version=1) at /usr/include/boost/serialization/serialization.hpp:128
#28 0x0000000000444677 in boost::archive::detail::iserializer<boost::archive::text_iarchive, Game>::load_object_data (
    this=0x6b8090 <boost::serialization::singleton<boost::archive::detail::iserializer<boost::archive::text_iarchive, Game> >::get_instance()::t>, ar=..., x=0x6bdc60, file_version=1)
    at /usr/include/boost/archive/detail/iserializer.hpp:188
#29 0x00007ffff7bad852 in load_object (bis=..., t=0x6bdc60, ar=..., this=0x6bd4c0) at libs/serialization/src/basic_iarchive.cpp:362
#30 boost::archive::detail::basic_iarchive::load_object (this=0x7fffffffdb80, t=<optimized out>, bis=...) at libs/serialization/src/basic_iarchive.cpp:537
#31 0x0000000000454e03 in boost::archive::detail::load_non_pointer_type<boost::archive::text_iarchive>::load_standard::invoke<Game> (ar=..., t=...)
    at /usr/include/boost/archive/detail/iserializer.hpp:387
#32 0x0000000000454914 in boost::archive::detail::load_non_pointer_type<boost::archive::text_iarchive>::invoke<Game> (ar=..., t=...) at /usr/include/boost/archive/detail/iserializer.hpp:439
#33 0x00000000004543c5 in boost::archive::load<boost::archive::text_iarchive, Game> (ar=..., t=...) at /usr/include/boost/archive/detail/iserializer.hpp:592
#34 0x0000000000453d6e in boost::archive::detail::common_iarchive<boost::archive::text_iarchive>::load_override<Game> (this=0x7fffffffdb80, t=...)
    at /usr/include/boost/archive/detail/common_iarchive.hpp:66
#35 0x0000000000453745 in boost::archive::basic_text_iarchive<boost::archive::text_iarchive>::load_override<Game> (this=0x7fffffffdb80, t=...)

我不明白这是否与构造函数或序列化函数有关,因为看起来它正在尝试使用null初始化,对吧?

Juaxix

发现了错误,您必须确定序列化数据时的顺序,保存时的顺序必须与加载数据文件时的顺序相同(对于相同版本的“存档”)。如果对主类使用运算符<<和>>而不是&,而对矢量使用向量而不是本机Classes arrays []会更好,因为boost :: serialization将更好地替换空数据,并且它将调用副本构造函数查找正确的参数。Linux的问题是编译选项。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 Boost 构建错误序列化结构到 XML

使用Jackson反序列化时避免构造函数调用

引入 shared_ptr 导致反序列化时出现分段错误(使用 boost::serialization)

如何使用带有非默认构造函数的指针进行Boost序列化

分段错误而不是构造函数调用

在序列化和反序列化期间如何调用构造函数?

使用boost序列化多态类

使用自定义构造函数反序列化格式错误的 JSON

使用统一初始化调用副本构造函数

通过使用空构造函数扩展可序列化?

序列化函数调用

fastxml使用toString进行序列化,并使用String构造函数进行反序列化

可以使用boost序列化对boost :: container :: strings进行序列化吗?

构造函数在错误的时间被调用

使用Boost套接字进行Boost序列化失败

使用无参数构造函数对对象进行序列化和反序列化

使用Elasticsearch Python的序列化错误

为什么在非MonoBehaviour序列化类中多个构造函数调用?

Java 记录序列化和对规范构造函数的重复调用

Boost序列化:使用根内存管理序列化树

如何从默认构造函数调用参数化的构造函数?

使用函数的返回值初始化对象时未调用复制构造函数

在构造函数中使用输出参数函数初始化const成员的调用的代码比lambda简单

如何使用Boost序列化mersenne_twister_engine?

如何使用谷物序列化boost :: ptr_vector?

谷物和Boost序列化是否使用零拷贝?

如何使用Boost序列化glm :: vec3

在C ++中使用BOOST序列化循环图

C ++:使用Boost序列化来写入/读取文件