C28651
avertissement C28651 : L’initialiseur statique provoque la copie sur les pages d’écriture en raison des pointeurs de fonction membre
Les initialiseurs statiques de variables const globales ou statiques peuvent souvent être entièrement évalués au moment de la compilation, donc générés dans RDATA. Toutefois, si un initialiseur est une fonction pointeur vers un membre où il s’agit d’une fonction non statique, l’initialiseur entier peut être placé dans des pages de copie sur écriture, ce qui a un coût de performances.
Pour les fichiers binaires qui nécessitent un chargement rapide et une réduction de la copie sur les pages d’écriture, vérifiez que tous les pointeurs de fonction dans l’initialiseur statique ne sont pas des fonctions de pointeur vers les membres. Si une fonction pointeur vers membre est requise, écrivez une fonction membre statique simple qui encapsule un appel à la fonction membre réelle.
Exemple
L’exemple de code suivant génère cette erreur.
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);
}
}
L’exemple de code suivant évite cette erreur.
class MyClass
{
...
bool memberFunc();
static bool memberFuncWrap(MyClass *thisPtr)
{ return thisPtr->memberFunc(); }
...
};
const StructType MyStruct[] = {
...
&MyClass::memberFuncWrap,
...
};