ブーストシリアル化を使用してデータベースを保存しようとすると、解決できないセグメンテーションが発生します。助けてくれませんか?どんな提案もありがとうございます。 は、私が犯人として、以下の文を釘付けしかしブースト::シリアル化を使用してデータを保存するときのSegフォルト
oa << *this;
私のコードセクションは以下の通りです、それを解決する方法がわからないました:私はポイントピンすることができた
template<class Archive>
void nDB::serialize(Archive &ar, const unsigned int version) {
ar & _LAYERS;
ar & _MACROS;
ar & _MODULES;
ar & _INSTS;
}
void nDB::save_db(string filename) {
std::ofstream ofs(filename.c_str(), std::ios::out | std::ios::binary);
//assert(ofs.good());
boost::archive::binary_oarchive oa(ofs);
oa << *this;
ofs.close();
}
こんにちは、 私のデータベースの循環参照に発行します。コードは以下の通りです:
template<class Archive>
void pin::serialize(Archive &ar, const unsigned int version) {
ar & pin_Port;
ar & pin_Layer;
}
と
以下こんにちは、私は犯人がofs.close();
である疑いがある私のクラス定義
class pin {
public:
port* pin_Port;
layer* pin_Layer;
// rect* pin_shape;
pin();
~pin();
void set_port(port*);
void set_layer(layer*);
string get_name();
port* get_port();
layer* get_layer();
string get_layer_name();
double get_layer_width();
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version);
};
class port {
public:
string port_Name;
char port_Use;
char port_Dir;
pin_vector port_PINS;
port();
~port();
void set_name(string);
void set_use(int);
void set_dir(int);
string get_name(void);
string get_use(void);
string get_dir(void);
void add_pin(pin*);
pin_vector get_all_pins(void);
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version);
};
こんにちはildjarn 、私はあなたが提案したことをやったが、それは解決しない。コードに間違っていることは何かありますか?ありがとうございますildjarn –
@ビン:いいえ、あなたは十分なコードを伝えることができませんでした。 ; - ]現在表示されているコードの 'ofs.close();'を削除するだけで良い状態になるので、表示していないコードに問題がなければなりません。 – ildjarn
おかげでildjarn、あなたは絶対に正しいです。私は自分のデータベース内の循環参照にその問題を差し引くことができました。私がデバッグするために行ったことは、各クラスのserialize関数で各コンポーネントを順々にオフにすることでした。最後に、私はそれが循環参照から来ていることを確認することができました。今私は私の質問は、循環参照を世話するブーストシリアライゼーションを行う方法に凝縮されるか、まったく不可能になると思います。循環参照のコードは次のとおりです。 –