Aracılığıyla paylaş


C28651

uyarı C28651: Statik başlatıcı, üye işlev işaretçileri nedeniyle yazma sayfalarında kopyalamaya neden oluyor

Genel veya statik sabit değişkenlerin statik başlatıcıları genellikle derleme zamanında tam olarak değerlendirilebilir, bu nedenle RDATA'da oluşturulur. Ancak herhangi bir başlatıcı, statik olmayan bir işlev olduğu üyeye işaretçi işleviyse, başlatıcının tamamı performans maliyeti olan yazma üzerine kopyalama sayfalarına yerleştirilebilir.

Hızlı yükleme gerektiren ve yazma sayfalarındaki kopyayı en aza indiren ikili dosyalar için, statik başlatıcıdaki tüm işlev işaretçilerinin işaretçiden üyeye işlevler olmadığından emin olun. Üyeye işaretçi işlevi gerekiyorsa, çağrıyı gerçek üye işlevine sarmalayan basit bir statik üye işlevi yazın.

Örneği

Aşağıdaki kod örneği bu hatayı oluşturur.

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);
}
}  

Aşağıdaki kod örneği bu hatayı önler.

class MyClass
{
    ...
    bool memberFunc();
    static bool memberFuncWrap(MyClass *thisPtr)
        { return thisPtr->memberFunc(); }
    ...
};
const StructType MyStruct[] = {
    ...
    &MyClass::memberFuncWrap,
    ...
};