1

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

当我使用 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 c首先RWTValHashMap<long, long, A::long_hash, A::long_equal> A::_aClasses初始化可能会有所不同,甚至在使用相同的编译器时可能会发生变化。您以前的编译器总是以所需的顺序初始化它们只是运气。

避免这种情况的一种方法是使用“第一次使用时的构造”

于 2013-01-08T21:06:16.383 回答