【发布时间】:2012-04-30 06:42:03
【问题描述】:
出现以下无法解释的行为:
案例一:
a.cpp 编译为 .dll 库并在 main.cpp 的 main() 中使用
Bar b;
//constr
Bar::Bar(){
//... initialize members
}
//private library init
Bar::init(){ ...}
//public API init
bool lib_init(){
b.init();
}
据我了解,这种方法可能会由于全局变量的未定义初始化行为而失败。
案例2:
a.cpp 编译为 .dll 库并在 main.cpp 的 main() 中使用
Bar* b;
//constr
Bar::Bar(){
//... initialize members
}
//private library init
Bar::init(){ ...}
//public API init
bool lib_init(){
b = new Bar;
b->init();
}
这一次它起作用了,当使用动态分配时。
案例 3(最令人惊讶)
a.cpp 编译为 .dll 库并在 main.cpp 的 main() 中使用
static Bar& getBarObj()
{
static Bar g_objBar;
return g_objBar;
}
//constr
Bar::Bar(){
//... initialize members
}
//private library init
Bar::init(){ ...}
//public API init
bool lib_init(){
getBarObj().init();
}
与案例 1 不同,其中 Bar obj 实例化可能未定义,在案例 3 中,它是“根据请求”使用的。然而,案例 3 提供了与案例 1 相同的行为。
我的问题是……谁能解释这里发生了什么? 一切都是用VC2008 Release模式构建的(这个项目没有Debug模式选项)
【问题讨论】:
-
您看到了什么“无法解释的行为”?
-
在 Bar constr 中,我有一个初始化循环。它的成员之一是 struct Foo 类型的固定大小数组,在“a.h”中定义。例如,循环不是迭代 SIZE_OF_ARRAY = 8 次,而是迭代 50K 次......
-
请将其编辑到您的问题中,包括相关代码 - 在那篇(已经很长的)帖子中没有描述您的实际问题。
标签: c++ global-variables object-initializers non-static