2012-04-06 12 views
1

ブーストシリアル化を使用してデータベースを保存しようとすると、解決できないセグメンテーションが発生します。助けてくれませんか?どんな提案もありがとうございます。 は、私が犯人として、以下の文を釘付けしかしブースト::シリアル化を使用してデータを保存するときの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); 
    }; 

答えて

1

です。 binary_oarchiveオブジェクトは、binary_oarchiveオブジェクトが残りのデータを書き込んでそのストリームをそのデストラクターでフラッシュしようとするため、のスコープ外に出て、のストリームが閉じられている必要があります。

標準ストリームは範囲外になると自動的にフラッシュされ、閉じられます。そのため、ラインは完全に不要です(この場合は有害です)。それを取り除くと、あなたは行かなくてはなりません。

(など、_MACROS、関係のない、しかし_LAYERSひどい名であり、実際にはユーザーコードで違法である。先頭にアンダースコアまたは大文字のいずれかを取り除く、好ましくは両方。)

+0

こんにちはildjarn 、私はあなたが提案したことをやったが、それは解決しない。コードに間違っていることは何かありますか?ありがとうございますildjarn –

+0

@ビン:いいえ、あなたは十分なコードを伝えることができませんでした。 ; - ]現在表示されているコードの 'ofs.close();'を削除するだけで良い状態になるので、表示していないコードに問題がなければなりません。 – ildjarn

+0

おかげでildjarn、あなたは絶対に正しいです。私は自分のデータベース内の循環参照にその問題を差し引くことができました。私がデバッグするために行ったことは、各クラスのserialize関数で各コンポーネントを順々にオフにすることでした。最後に、私はそれが循環参照から来ていることを確認することができました。今私は私の質問は、循環参照を世話するブーストシリアライゼーションを行う方法に凝縮されるか、まったく不可能になると思います。循環参照のコードは次のとおりです。 –

関連する問題