情景:
單件模式下實(shí)例的獲取函數(shù)Get()的實(shí)現(xiàn)寫在頭文件中,在其它文件中使用獲取函數(shù)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的實(shí)例只有一個(gè),首次使用會(huì)調(diào)用A::A(),程序結(jié)束時(shí)調(diào)用A::~A()。
問題:
在一個(gè)項(xiàng)目中,一段類似的代碼在VC6 release Max-Speed下編譯,其運(yùn)行時(shí)多次調(diào)用A::A(),this指針相同,程序退出時(shí),A::~A()調(diào)用超過1次,并在2次出現(xiàn)訪問異常。而在VS2008、VC6 Debug或者VC6 Release的非Max-Speed優(yōu)化選項(xiàng)下編譯的程序則運(yùn)行正常。
此外如果將A::Get()的實(shí)現(xiàn)寫在xxx.cpp中,則使用VC6 release Max-Speed編譯的程序運(yùn)行正常。
個(gè)人猜測(cè):
是否是VC6在執(zhí)行Max-Speed選項(xiàng)時(shí)內(nèi)聯(lián)不當(dāng)引起的問題。嘗試使用VC6建立簡(jiǎn)單工程,實(shí)現(xiàn)上述邏輯時(shí),但并未發(fā)現(xiàn)A::A()調(diào)用多次的情況。