1

g++ 4.3 と Rogue Wave ライブラリを使用して、Linux システムで簡単なテスト プログラムを作成しています。ここで直面している問題は、次のコードはコンパイルできるが、実行するとこの行でセグメンテーション違反が発生することです。

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

メイン.cxx

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

static B c;

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

1 に答える 1

1

異なる変換ユニット(基本的に異なるcpp / cxxファイル)からの静的メンバーの初期化の順序は指定されていません。したがって、最初に初期化されるかどうstatic B cRWTValHashMap<long, long, A::long_hash, A::long_equal> A::_aClassesは、コンパイラーごとに異なる可能性があり、同じコンパイラーを使用する場合でも変わる可能性があります。以前のコンパイラが常に希望の順序でそれらを初期化できたのは幸運でした。

これを回避する方法は、「最初の使用イディオムの構成」を使用することです。

于 2013-01-08T21:06:16.383 に答える