任何人都可以帮我理解为什么我的代码在第一个代码块中的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;
答案 0 :(得分:3)
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));