使用SecureZeroMemory进行new / delete问题

时间:2018-03-09 21:06:22

标签: c++ winapi new-operator delete-operator 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;

1 个答案:

答案 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));