gpt4 book ai didi

c++ - 使用 SecureZeroMemory 新建/删除问题

转载 作者:行者123 更新时间:2023-11-27 23:47:46 27 4
gpt4 key购买 nike

谁能帮我理解为什么我的代码在第一段代码中的 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++ 运行时允许分配比您要求的更多的分配,它经常这样做,以便它可以将特殊数据添加到缓冲区的末尾,以便它可以检测缓冲区溢出。

改为做这样的事情:

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

如果缓冲区总是很小,你可以只在堆栈上使用一个数组:

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

关于c++ - 使用 SecureZeroMemory 新建/删除问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49202138/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com