2012-04-06 5 views
1

При попытке сохранить базу данных с использованием синтаксиса 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); 
    }; 

ответ

1

класс Я подозреваю, что виновником является ofs.close();. Объект binary_oarchive должен выйти за пределы области действия до, лежащий в основе поток закрыт, потому что объект binary_oarchive пытается записать оставшиеся данные и очистить поток в своем деструкторе.

Стандартные потоки сбрасываются и закрываются автоматически, когда они выходят за пределы видимости, поэтому линия совершенно не нужна (и в этом случае вредна). Удалите его, и вам должно быть хорошо идти.

(Unrelated, но _LAYERS, _MACROS и т.д., страшных имен, а на самом деле является незаконными в пользовательском коде. Избавиться от любого ведущего подчеркивания или прописных букв, предпочтительно оба.)

+0

Привета Илдъярн , Я сделал то, что вы предложили, но это не решает. Вы видите что-то еще, что не так с кодом? Спасибо ildjarn –

+0

@Binh: Нет, вы не указали достаточно кода, чтобы иметь возможность сказать. ;] Для кода, показанного на данный момент, просто удаление 'ofs.close();' помещает его в хорошее состояние, поэтому ваша проблема должна быть в коде, который вы не показывали. – ildjarn

+0

Спасибо ildjarn, вы абсолютно правы. Я смог вычесть проблему в круглую ссылку в моей базе данных. То, что я делал для отладки, заключалось в том, чтобы последовательно отключать каждый компонент в функции serialize для каждого класса. В конце я смог определить, что это происходит из круговой ссылки. Теперь, я думаю, мой вопрос будет сведен к тому, как сделать сериализацию boost, заботясь о круговой ссылке, или это будет невозможно вообще. Мой код для циркулярной ссылки приведен ниже: –

 Смежные вопросы

  • Нет связанных вопросов^_^