Может кто-нибудь помочь мне понять, почему мой код не удается удалить [] szPassword в первом блоке кода? Я знаю, что szPassword только копирует «а», а st2 равен 8:
TCHAR *szPassword = new TCHAR[2]();
StringCchCopy(szPassword, 2, L"ab");
SIZE_T st2 = sizeof(szPassword);
SecureZeroMemory(szPassword, st2);
delete[] szPassword;
Однако при запуске без получения значения sizeof () все работает нормально:
TCHAR *szPassword = new TCHAR[2]();
StringCchCopy(szPassword, 2, L"ab");
SecureZeroMemory(szPassword, 2);
delete[] szPassword;
szPassword является указателем, а не массивом и, следовательно, sizeof(szPassword)
будет 4 или 8. В 64-битном приложении это слишком много, вы попытаетесь записать 8 байтов в 4-байтовый буфер.
Среде выполнения C ++ разрешено выделять больше, чем вы запрашиваете, и это часто делает это, так что он может добавлять специальные данные в конец буфера, чтобы он мог обнаружить переполнения буфера.
Сделайте что-то вроде этого:
const UINT charcount = 2;
TCHAR *szPassword = new TCHAR[charcount];
...
SecureZeroMemory(szPassword, charcount * sizeof(TCHAR));
delete[] szPassword;
Если буфер всегда маленький, вы можете просто использовать массив в стеке:
TCHAR szPassword[200];
...
SecureZeroMemory(szPassword, sizeof(szPassword));
Других решений пока нет …