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,
    ...
};