C28651
peringatan C28651: Inisialisasi statis menyebabkan penyalinan pada halaman tulis karena penunjuk fungsi anggota
Inisialisasi statis variabel konstan global atau statis sering kali dapat dievaluasi sepenuhnya pada waktu kompilasi, sehingga dihasilkan dalam RDATA. Namun jika ada penginisialisasi adalah fungsi pointer-to-member yang merupakan fungsi non-statis, seluruh penginisialisasi dapat ditempatkan di halaman copy-on-write, yang memiliki biaya performa.
Untuk biner yang memerlukan pemuatan cepat dan meminimalkan salinan pada halaman tulis, pertimbangkan untuk memastikan semua penunjuk fungsi dalam penginisialisasi statis bukan fungsi pointer-to-member. Jika fungsi pointer-to-member diperlukan, tulis fungsi anggota statis sederhana yang membungkus panggilan ke fungsi anggota yang sebenarnya.
Contoh
Contoh kode berikut menghasilkan kesalahan ini.
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);
}
}
Contoh kode berikut menghindari kesalahan ini.
class MyClass
{
...
bool memberFunc();
static bool memberFuncWrap(MyClass *thisPtr)
{ return thisPtr->memberFunc(); }
...
};
const StructType MyStruct[] = {
...
&MyClass::memberFuncWrap,
...
};