0

谁能帮我理解为什么我的代码在第一个代码块中的 delete[] szPassword 上失败了?我知道szPassword只是复制“a”,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;
4

1 回答 1

4

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));
于 2018-03-09T22:07:17.077 回答