【发布时间】:2018-03-09 21:06:21
【问题描述】:
谁能帮我理解为什么我的代码在第一个代码块中的 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;
【问题讨论】:
-
你检查过
sizeof(szPassword);给你的价值吗? (提示:极不可能是 2) -
很明显,您对
SecureZeroMemory的调用最终会超出数组的边界,调用未定义的行为 -
不是“可以”,但可以。你知道未定义的行为是什么意思吗?
-
未定义的行为意味着任何事情都可能发生。在你的情况下,你似乎很幸运,编译器在
delete[]捕获它(这让我相信你在调试模式下运行它) -
@JeffR,例如使用
std::vector。
标签: c++ winapi new-operator delete-operator securezeromemory