我正在使用C++ boost庫1.6.3序列化並保存到文本文件中,其中包含不同類的遊戲的主類,它們是指針和引用,數組和基本類型變量,問題是當我加載文件,它崩潰給這個輸出:CRASH:分段錯誤:加載序列化加載 - 調用構造函數爲null
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)在子類中,擦鞋,從BJShoe繼承做同樣的:(1),並添加base_object功能,例如:
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=...)
,如果這是與構造或功能序列化的東西我不理解,因爲看起來它試圖用零初始化,對不對?