SecureZeroMemory 的 new/delete 问题

Issue with new/delete with SecureZeroMemory

谁能帮我理解为什么我的代码在第一段代码中的 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;

szPassword 是一个指针,而不是数组,因此 sizeof(szPassword) 将为 4 或 8。在 64 位应用程序中,这太多了,您将尝试将 8 字节写入 4 字节缓冲区。

C++ run-time 允许分配比您要求的更多的分配,它经常这样做,因此它可以将特殊数据添加到缓冲区的末尾,以便检测缓冲区溢出。

改为执行以下操作:

const UINT charcount = 2;
TCHAR *szPassword = new TCHAR[charcount];
...
SecureZeroMemory(szPassword, charcount * sizeof(TCHAR));
delete[] szPassword;

如果缓冲区始终是 small-ish,您可以只在堆栈上使用一个数组:

TCHAR szPassword[200];
...
SecureZeroMemory(szPassword, sizeof(szPassword));