Странная проблема с использованием RWTValHashMap с g ++ в Linux

Я пишу простую тестовую программу в системе Linux с использованием g ++ 4.3 и библиотеки Rogue Wave. Проблема, с которой я здесь сталкиваюсь, заключается в том, что следующие коды могут быть скомпилированы, но при запуске я получу ошибку сегментации в этой строке:
_aClasses.insertKeyAndValue (100,1000);

Когда я запускаю тот же фрагмент кода на машине HPUX с помощью компилятора aCC. Это работает гладко, что меня смущает. Это потому, что способ инициализации статической переменной в 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) не указан. Так ли static B c или же RWTValHashMap<long, long, A::long_hash, A::long_equal> A::_aClasses будет инициализирован первым, может отличаться для разных компиляторов и может даже измениться при использовании одного и того же компилятора. Просто было удачей, что ваш предыдущий компилятор всегда инициализировал их в нужном порядке.

Чтобы избежать этого, используйте «построить при первом использовании идиома»

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]