2013-01-08 5 views
1

g ++ 4.3 및 Rogue Wave 라이브러리를 사용하여 Linux 시스템에서 간단한 테스트 프로그램을 작성합니다. 여기에서 직면하는 문제는 다음 코드를 컴파일 할 수 있지만 실행하면이 줄에 세그먼트 오류가 나타납니다. _aClasses.insertKeyAndValue (100,1000);Linux에서 g ++로 RWTValHashMap을 사용하는 이상한 문제

aCC 컴파일러를 사용하여 HPUX 컴퓨터에서 동일한 조각 코드를 실행할 때. 그것은 원활하게 실행되어 나를 혼란스럽게 만듭니다. 정적 변수를 g ++에서 초기화하는 방법이 aCC와 다른 점 때문입니까? 여기에 무슨 일이 일어나는 지 아는 사람이 있습니까? 미리 감사드립니다.

A.hxx

#include <rw/tvhdict.h> 
#include <rw/cstring.h> 
#include <rw/rwdate.h> 
#include <rw/rstream.h> 

using namespace std; 

class A 
{ 
    public : 
    A(); 
    static void add(); 
    struct long_hash { 
     unsigned long operator() (const long& x) const { return x;}; 
    }; 
    struct long_equal { 
     RWBoolean operator() (const long& x, const long& y) const { return x==y;}; 
    }; 
    private: 
    static RWTValHashMap<long, long, long_hash, long_equal> _aClasses; 
}; 

A.cxx

#include "A.hxx" 

RWTValHashMap<long, long, A::long_hash, A::long_equal> A::_aClasses; 

A::A() 
{ 
    cout<<"init A"<<endl; 
} 

void A::add() 
{ 
    _aClasses.insertKeyAndValue(100,1000); 
} 

B.hxx

class B 
{ 
    public: 
     B(); 
}; 

B.cxx

#include "B.hxx" 
#include "A.hxx" 

B::B() 
{ 
    A::add(); 
} 

는 Main.cxx

#include "A.hxx" 
#include "B.hxx" 

static B c; 

int main() { 
    cout<<"main"<<endl; 
    return 0; 
} 

답변

1

다른 번역 단위에서 정적 멤버의 초기화의 순서 (본질적으로 다른 CPP/CXX 파일) not specified이다. 따라서 static B c 또는 RWTValHashMap<long, long, A::long_hash, A::long_equal> A::_aClasses이 먼저 초기화되는지 여부는 서로 다른 컴파일러에 따라 다를 수 있으며 동일한 컴파일러를 사용하는 경우에도 변경 될 수 있습니다. 이전 컴파일러가 항상 원하는 순서로 초기화 한 것은 운이 좋았습니다.

이를 방지 할 수있는 방법이 내가 전에 그 기사를 읽고 그 이론을 바탕으로 뭔가를 구현하지만 내 경우에는 작동하지 않았다 'construct on first use idiom'

+0

을 사용하는 것입니다. – user1349058

+0

@ user1349058 정적 초기화 순서를 실제로 고칠 수 없기 때문에 문제가 발생한 후에 만 ​​문제를 게시 할 것을 제안합니다. –

+0

__attribute__ ((init_priority()))를 사용하여 하나의 var을 먼저 초기화하도록 수정했습니다. 또한 연결 순서 종류도 중요합니다. – user1349058