出现以下无法解释的行为:
情况1:
a.cpp
编译为 .dll 库并在 main() 中使用main.cpp
Bar b;
//constr
Bar::Bar(){
//... initialize members
}
//private library init
Bar::init(){ ...}
//public API init
bool lib_init(){
b.init();
}
据我了解,这种方法可能会由于全局变量的未定义初始化行为而失败。
案例二:
a.cpp
编译为 .dll 库并在 main() 中使用main.cpp
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() 中使用main.cpp
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();
}
与可能未定义 Bar obj 实例化的情况 1 相反,在情况 3 中,它是“根据请求”使用的。然而,案例 3 提供了与案例 1 相同的行为。
我的问题是……谁能解释这里发生了什么?一切都是用 VC2008 发布模式构建的(这个项目没有调试模式选项)