2012-04-06 11 views
1

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); 
    }; 

Antwort

1

Ich vermute, die Täter ofs.close(); ist. Das Objekt binary_oarchive muss den Gültigkeitsbereich verlassen, bevor der zugrunde liegende Stream geschlossen wird, da das Objekt binary_oarchive versucht, verbleibende Daten zu schreiben und den Stream in seinem Destruktor zu leeren.

Standard-Streams werden automatisch gespült und geschlossen, wenn sie außerhalb des Bereichs liegen. Die Leitung ist also völlig unnötig (und in diesem Fall schädlich). Entferne es und du solltest gut gehen.

(Unrelated, aber _LAYERS, _MACROS usw. sind schrecklich Namen, und in der Tat sind in Benutzercode illegal. Holen Sie sich das Unterstrich oder die Großbuchstaben entweder befreien, vorzugsweise beides.)

+0

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 –

+0

@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

+0

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: –

Verwandte Themen