内联单件模式的获取实例函数在VC6 Max-Speed选项下的错误

内联单件模式的获取实例函数在VC6 Max-Speed选项下的错误

情景:

单件模式下实例的获取函数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()调用多次的情况。

你可能感兴趣的:(内联单件模式的获取实例函数在VC6 Max-Speed选项下的错误)