2012-04-06 2 views
1

부스트 직렬화를 사용하여 데이터베이스를 저장하려고하면 해결할 수없는 segfault가 발생합니다. 도와 주시겠습니까? 어떤 제안이라도 대단히 감사하겠습니다. 내가 범인으로 아래의 문을 고정하지만부울 :: 직렬화를 사용하여 데이터를 저장할 때 오류가 발생했습니다.

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

안녕하세요 아래 내가 범인 ofs.close(); 의심 내 클래스 정의

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

있습니다. binary_oarchive 개체는 binary_oarchive 개체가 나머지 데이터를 쓰고 해당 소멸자에서 스트림을 플러시하려고하기 때문에 범위 밖에서 기본 스트림이 닫혀 있어야합니다.

표준 스트림은 범위를 벗어날 때 자동으로 플러시되고 닫히므로 라인은 완전히 불필요합니다 (이 경우 해로운). 그것을 제거하면 좋을 것입니다.

(관련없는하지만 _LAYERS, _MACROS끔찍한 이름이며, 실제로 사용자 코드에서 불법입니다. 바람직하게는 둘 다 밑줄 또는 대문자 중 하나를 제거하십시오.)

+0

안녕 ildjarn , 나는 당신이 제안한 것을했지만 그것을 해결하지는 못합니다. 코드에 문제가있는 것이 있습니까? 고마워요 ildjarn –

+0

@Binh : 아니요, 말할 수있을만큼 충분한 코드를 보여주지 않았습니다. ;] 현재 표시된 코드의 경우'ofs.close();를 제거하면 상태가 양호 해 지므로 표시되지 않은 코드에 문제가 있어야합니다. – ildjarn

+0

감사합니다 ildjarn, 당신은 절대적으로 옳습니다. 내 데이터베이스에서 순환 참조로 문제를 공제 할 수있었습니다. 디버깅을 위해 내가 수행 한 작업은 각 클래스의 serialize 함수에서 각 구성 요소를 순차적으로 끄는 것이 었습니다. 결국 나는 원형 참조에서 유래했는지를 확인할 수있었습니다. 이제 내 질문에 순환 참조를 돌보는 부스트 직렬화를 만드는 방법으로 압축되거나 전혀 불가능할 것 같다. 순환 참조에 대한 내 코드는 다음과 같습니다. –

관련 문제