我有一个带有以下代码的静态库:
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。
有谁知道会发生什么事?
答案 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 ++的静态初始化顺序问题: