静态成员对象初始化失败

时间:2010-10-15 05:54:10

标签: c++

我有一个带有以下代码的静态库:

h file:

class Foo
{
public:
   Foo()
   {
       a = 4;
   }

   int a;
};


class Bar
{
public:
    static const Foo foo;
};

cpp文件:

const Bar::foo = Foo();

我的问题是,在 main()之后的某段时间之前,bar :: foo不会被a = 4初始化。之前a = 0。我试图从一个DLL静态链接到上面的库访问Bar :: foo。我的应用程序链接到该DLL但不直接访问Bar :: foo。我正在使用Visual Studio 2008。

有谁知道会发生什么事?

4 个答案:

答案 0 :(得分:7)

  

$ 3.6.2 / 2-“静态变量   存储持续时间(3.7.1)或线程   储存期限(3.7.2)应为   在任何之前零初始化(8.5)   其他初始化发生。“

这解释了为什么你得到0的值

  

$ 3.6.2 / 4-“这是   实现 - 定义是否   动态初始化非本地   变量与静态存储持续时间   是在第一个陈述之前完成的   主要。 如果初始化是   推迟到某个时间点之后   主要的第一个陈述,它应该   在第一次使用之前发生   函数或变量在。中定义   与变量相同的翻译单位   要初始化。

因此,当您尝试访问尚未初始化的静态存储持续时间的变量时,您尝试执行的操作会导致未定义的行为,因为该转换单元中尚未使用任何代码。

答案 1 :(得分:1)

您何时何地访问Bar::foo?如果它静态链接到DLL中,那么应该在调用DllMain()''process attach'之前初始化它。

您是否为DLL设置了不同于默认值_DllMainCRTStartup

的入口点

答案 2 :(得分:1)

为什么不在bar中定义一个返回对Foo的引用的静态方法,并且在该静态方法中,有一个静态实例Foo,这样当它第一次被调用时(无论在哪里),它将正确获取初始化?

class Bar
{
  public:
    static Foo& foo()
    {
      static Foo inst;
      return inst;
    }
};

答案 3 :(得分:1)

哪些代码注意到Bar::foo尚未初始化?如果它是DLL中的另一个静态初始化,那么你可能会遇到C ++的静态初始化顺序问题: