在Linux上使用g++使用RWTValHashMap时会出现奇怪的问题



我正在用g++ 4.3和Rogue Wave库在Linux系统上编写一个简单的测试程序。我在这里面临的问题是,可以编译以下代码,但当我运行它时,它会在这一行弹出分段错误:_aClasses.insertKeyAndValue(100、1000);

当我使用aCC编译器在HPUX机器上运行同一段代码时。它运行得很平稳,这让我很困惑。这是因为c++初始化静态变量的方式与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;
}

未指定来自不同翻译单元(本质上是不同的cpp/cxx文件)的静态成员的初始化顺序。因此,对于不同的编译器,首先初始化static B c还是RWTValHashMap<long, long, A::long_hash, A::long_equal> A::_aClasses可能会有所不同,甚至在使用相同的编译器时也可能会发生变化。很幸运,以前的编译器总是按照期望的顺序初始化它们。

避免这种情况的一种方法是使用'construct on first use idiom'

相关内容

  • 没有找到相关文章