c++ - 使用 boost::serialization 保存数据时出现段错误

标签 c++ boost segmentation-fault boost-serialization

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

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

最佳答案

我怀疑罪魁祸首是 ofs.close();binary_oarchive 对象需要在底层流关闭之前 超出范围,因为 binary_oarchive 对象会尝试写入剩余数据并刷新流在它的析构函数中。

标准流在超出范围时会自动刷新和关闭,因此该行完全没有必要(在这种情况下是有害的)。删除它,你应该可以开始了。

(无关,但是_LAYERS_MACROS等是可怕的名称,实际上在用户代码中是非法的。去掉前导下划线或大写字母,最好是两者。)

关于c++ - 使用 boost::serialization 保存数据时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10038090/

相关文章:

c++ - 查询 std::mutex 锁定状态

c++ - 带有双端队列的随机访问迭代器的无效迭代器

c++ - boost::filesystem、std::getenv 和并发

c++ - 将 char 写入 char * 地址时出现段错误

C 语言 - 这可能是段错误,但我不确定?

c++ - 如何使用复选框更改 QGraphicsView 背景

c++ - 如何将文本文件读入二维 vector ?

c++错误访问boost fusion 对中的字段类型

c++ - 如何将 fusion 容器大小限制扩展到 50 以上?

c - 字计数器中的段错误