1

ブースト シリアル化を使用してデータベースを保存しようとすると、解決できない segfault が発生します。助けてくださいませんか?どんな提案でも大歓迎です。以下のステートメントを犯人として突き止めましたが、解決方法がわかりません

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

    template<class Archive>
    void port::serialize(Archive & ar, const unsigned int version){
    ar & port_Name;
    ar & port_Use;
    ar & port_Dir;
    ar & port_PINS;
    }

こんにちは、以下は私のクラス定義です

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

1 に答える 1

1

犯人は だと思いofs.close();ます。オブジェクトは、残りのデータを書き込み、デストラクタでストリームをフラッシュしようとするため、基になるストリームが閉じられるbinary_oarchiveにスコープ外に出る必要があります。binary_oarchive

標準ストリームは、範囲外になると自動的にフラッシュされて閉じられるため、行は完全に不要です (この場合は有害です)。それを削除すると、準備完了です。

(関係ありませんが_LAYERS_MACROS、 などはひどい名前であり、実際にはユーザー コードでは違法です。先頭のアンダースコアまたは大文字のいずれか、できれば両方を取り除きます。)

于 2012-04-06T01:27:46.670 に答える