Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost::serialization保存数据时出现Seg错误_C++_Boost_Segmentation Fault_Boost Serialization - Fatal编程技术网

C++ 使用boost::serialization保存数据时出现Seg错误

C++ 使用boost::serialization保存数据时出现Seg错误,c++,boost,segmentation-fault,boost-serialization,C++,Boost,Segmentation Fault,Boost Serialization,在尝试使用boost序列化保存数据库时,我遇到了无法解决的segfault。你能帮忙吗?非常感谢您的任何建议。 我已经将下面的陈述确定为罪魁祸首,但不确定如何解决它 oa << *this; oa我怀疑罪犯是ofs.close()。在关闭底层流之前,binary\u-oarchive对象需要超出作用域,因为binary\u-oarchive对象试图写入剩余数据并在其析构函数中刷新流 标准流在超出范围时会自动冲洗和关闭,因此该管线完全没有必要(在这种情况下是有害的)。把它拿走,你就可

在尝试使用boost序列化保存数据库时,我遇到了无法解决的segfault。你能帮忙吗?非常感谢您的任何建议。 我已经将下面的陈述确定为罪魁祸首,但不确定如何解决它

oa << *this;

oa我怀疑罪犯是
ofs.close()。在关闭底层流之前,
binary\u-oarchive
对象需要超出作用域,因为
binary\u-oarchive
对象试图写入剩余数据并在其析构函数中刷新流

标准流在超出范围时会自动冲洗和关闭,因此该管线完全没有必要(在这种情况下是有害的)。把它拿走,你就可以走了


(不相关的,但
\u层
\u宏
等都是可怕的名称,事实上在用户代码中是非法的。去掉前导下划线或大写字母,最好两者都去掉。)

我怀疑罪魁祸首是
of s.close()。在关闭底层流之前,
binary\u-oarchive
对象需要超出作用域,因为
binary\u-oarchive
对象试图写入剩余数据并在其析构函数中刷新流

标准流在超出范围时会自动冲洗和关闭,因此该管线完全没有必要(在这种情况下是有害的)。把它拿走,你就可以走了


(不相关的,但
\u层
\u宏
等都是可怕的名称,事实上在用户代码中是非法的。去掉前导下划线或大写字母,最好两者都去掉。)

嗨,ildjarn,我已经按照你的建议做了,但没有解决它。你看到代码还有什么问题吗?谢谢ildjarn@Binh:不,您没有显示足够的代码,无法识别。;-]对于目前显示的代码,只需删除ofs.close()的
使其处于良好状态,因此您的问题一定是您尚未显示的代码。谢谢ildjarn,您完全正确。我能够在我的数据库中将这个问题归结为循环引用。我所做的调试是依次关闭每个类的serialize函数中的每个组件。最后,我能够确定它来自循环引用。现在我想我的问题将被浓缩到如何使boost序列化处理循环引用,否则它将根本不可能。我的循环参考代码如下:哦,你知道如何在注释部分添加代码吗?谢谢ildjarn,@Binh:最好将它编辑到你的问题中,这样它就可以被正确格式化。嗨,ildjarn,我已经按照你的建议做了,但没有解决它。你看到代码还有什么问题吗?谢谢ildjarn@Binh:不,您没有显示足够的代码,无法识别。;-]对于目前显示的代码,只需删除ofs.close()的
使其处于良好状态,因此您的问题一定是您尚未显示的代码。谢谢ildjarn,您完全正确。我能够在我的数据库中将这个问题归结为循环引用。我所做的调试是依次关闭每个类的serialize函数中的每个组件。最后,我能够确定它来自循环引用。现在我想我的问题将被浓缩到如何使boost序列化处理循环引用,否则它将根本不可能。我的循环参考代码如下:哦,你知道如何在注释部分添加代码吗?谢谢ildjarn,@Binh:最好将它编辑到你的问题中,这样就可以正确格式化。
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);
    };