情景:
單件模式下實例的獲取函數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()調用多次的情況。