当尝试使用 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/