Beim Versuch, die Datenbank mithilfe der Boost-Serialisierung zu speichern, stoße ich auf den Segfault, den ich nicht auflösen konnte. Würdest du bitte helfen? Jeder Vorschlag wird sehr geschätzt. Ich habe die Erklärung unten als die Schuldige festgenagelt, aber nicht sicher, wie es zu lösenSeg-Fehler beim Speichern von Daten mit boost :: serialization
oa << *this;
Mein Code-Abschnitt ist unten:
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();
}
Hallo, konnte ich Punkt festzustecken den Stellen Sie eine zirkuläre Referenz in meiner Datenbank aus. Der Code ist unten:
template<class Archive>
void pin::serialize(Archive &ar, const unsigned int version) {
ar & pin_Port;
ar & pin_Layer;
}
und
template<class Archive>
void port::serialize(Archive & ar, const unsigned int version){
ar & port_Name;
ar & port_Use;
ar & port_Dir;
ar & port_PINS;
}
Hallo unten sind meine Klassendefinition
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);
};
Hallo ildjarn Ich habe getan, was Sie vorgeschlagen haben, aber es löst es nicht. Siehst du irgendetwas anderes, das mit dem Code nicht stimmt? Danke ildjarn –
@Binh: Nein, Sie haben nicht genug Code gezeigt, um sagen zu können. ; -] Für den Code, der momentan angezeigt wird, wird durch das Entfernen von 'ofs.close();' ein guter Zustand erreicht, so dass Ihr Problem in einem Code sein muss, den Sie nicht angezeigt haben. – ildjarn
Danke ildjarn, du hast absolut recht. Ich konnte das Problem auf einen Zirkelbezug in meiner Datenbank zurückführen. Was ich für das Debugging getan habe, war das sequentielle Ausschalten jeder Komponente in der Serialisierungsfunktion für jede Klasse. Am Ende konnte ich feststellen, dass es sich um einen Zirkelbezug handelt. Jetzt denke ich, meine Frage wird kondensiert werden, um Boost-Serialisierung zu machen, die sich um Zirkularreferenz kümmert, oder es wird überhaupt nicht möglich sein. Mein Code für die Zirkelreferenz ist unten: –