Проблема с новым / удалить с SecureZeroMemory

Может кто-нибудь помочь мне понять, почему мой код не удается удалить [] 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;

0

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]