При попытке сохранить базу данных с использованием синтаксиса boost, я сталкиваюсь с segfault, который я не мог решить. Не могли бы вы помочь? Любое предложение очень ценится. я скованы заявление ниже в качестве виновника, но не уверен, как решить этоОшибка Seg при сохранении данных с помощью boost :: serialization
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);
};
Привета Илдъярн , Я сделал то, что вы предложили, но это не решает. Вы видите что-то еще, что не так с кодом? Спасибо ildjarn –
@Binh: Нет, вы не указали достаточно кода, чтобы иметь возможность сказать. ;] Для кода, показанного на данный момент, просто удаление 'ofs.close();' помещает его в хорошее состояние, поэтому ваша проблема должна быть в коде, который вы не показывали. – ildjarn
Спасибо ildjarn, вы абсолютно правы. Я смог вычесть проблему в круглую ссылку в моей базе данных. То, что я делал для отладки, заключалось в том, чтобы последовательно отключать каждый компонент в функции serialize для каждого класса. В конце я смог определить, что это происходит из круговой ссылки. Теперь, я думаю, мой вопрос будет сведен к тому, как сделать сериализацию boost, заботясь о круговой ссылке, или это будет невозможно вообще. Мой код для циркулярной ссылки приведен ниже: –