C28651
警告 C28651:靜態初始化表達式會導致寫入頁面上因為成員函式指標而複製
全域或靜態常數變數的靜態初始化表達式通常可在編譯時期完全評估,因此會在 RDATA 中產生。 不過,如果任何初始化運算式是非靜態函式的指針對成員函式,則整個初始化運算式可能會放在寫入時複製頁面上,其效能成本為 。
對於需要快速載入和最小化寫入頁面上複本的二進位檔,請考慮確定靜態初始化運算式中的所有函式指標都不是指針對成員函式。 如果需要指針對成員函式,請撰寫簡單的靜態成員函式,以包裝對實際成員函式的呼叫。
例子
下列程式代碼範例會產生此錯誤。
void Func()
{
WCHAR*pszBuf=newWCHAR[MAX_PATH];
DPA_InsertPtr(_hdpa, DA_LAST, pszBuf);
}
void CleanupDPA()
{
int count = DPA_GetCount(_hdpa);
for (int i = 0; i < count; i++)
{
delete [] (LPWSTR)DPA_GetPtr(_hdpa, i);
}
}
下列程式代碼範例會避免此錯誤。
class MyClass
{
...
bool memberFunc();
static bool memberFuncWrap(MyClass *thisPtr)
{ return thisPtr->memberFunc(); }
...
};
const StructType MyStruct[] = {
...
&MyClass::memberFuncWrap,
...
};