情景:
单件模式下实例的获取函数Get()的实现写在头文件中,在其它文件中使用获取函数Get()。
xxx.h
class A {
A& Get() {
static A s_A;
return s_A;
}
};
yyy.cpp
A::Get().FuncB();
zzz.cpp
A::Get().FuncA();
上述代码的期望逻辑是:A的实例只有一个,首次使用会调用A::A(),程序结束时调用A::~A()。
问题:
在一个项目中,一段类似的代码在VC6 release Max-Speed下编译,其运行时多次调用A::A(),this指针相同,程序退出时,A::~A()调用超过1次,并在2次出现访问异常。而在VS2008、VC6 Debug或者VC6 Release的非Max-Speed优化选项下编译的程序则运行正常。
此外如果将A::Get()的实现写在xxx.cpp中,则使用VC6 release Max-Speed编译的程序运行正常。
个人猜测:
是否是VC6在执行Max-Speed选项时内联不当引起的问题。尝试使用VC6建立简单工程,实现上述逻辑时,但并未发现A::A()调用多次的情况。