C28651
警告 C28651: メンバー関数ポインターが原因で、静的初期化子によるページのコピーオンライトが発生します
グローバル変数または静的 const 変数の静的初期化子は、多くの場合、コンパイル時に完全に評価できるため、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,
...
};