Я использую библиотеку ускорения C++ 1.6.3 для сериализации и сохранения в текстовом файле основного класса игры с различными классами, прикрепленными внутри нее в качестве указателей и ссылки, массивы и основные типы переменных, проблема, когда я загрузить файл, он выходит из строя дает этот вывод:CRASH: ошибка сегментации: ускорение загрузки сериализации - вызывающий конструктор с нулем
Assertion failed: register_type(bpis_ptr->get_basic_serializer()) == cid, file libs\serialization\src\basic_iarchive.cpp, line 454
дело в том, что этот класс похож на другие классы сериализовать и нет никаких ошибок с ними ,
Для сериализации это то, что я делаю, после форсирования :: инструкции сериализации: 1) В базовых классах: добавить класс друга для доступа к сериализации, а функция для сериализации, например:
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:
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"); нагрузка ("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
[[email protected] 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=..., [email protected]: 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=..., [email protected]: 0x6bd790)
at /usr/include/boost/archive/detail/iserializer.hpp:524
#3 0x0000000000456484 in boost::archive::load<boost::archive::text_iarchive, BJShoe*> (ar=..., [email protected]: 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, [email protected]: 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, [email protected]: 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, [email protected]: 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, [email protected]: 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=...)
я не понимаю, если это что-то связано с конструкторами или функции сериализации, потому что выглядит, как он пытается инициализировать нулем, верно?