gpt4 book ai didi

c++ - 为什么我在这个简单的代码中有 HEAP CORRUPTION?

转载 作者:搜寻专家 更新时间:2023-10-30 23:58:18 26 4
gpt4 key购买 nike

我有将十六进制字符串转换为字节数组的函数,

BYTE* HexStrToByteArray(std::wstring hex_str)
{
int len = hex_str.size()*0.5f;
BYTE *bytearray = new BYTE[len];
for(int i = 0; i < len; i++)
{
swscanf(hex_str.c_str() + 2*i, L"%02x", &bytearray[i]);
}
return bytearray;
}

在代码中我是这样使用的

BYTE *byte_array = HexStrToByteArray(hex_str);

现在函数工作正常,但是当我尝试释放内存时,在函数中分配

delete [] byte_array;//HEAP CORUPTION ERROR

我有 HEAP CORUPTION 错误...我做错了什么?

最佳答案

在您的代码上运行 valgrind 很快就会发现问题:

Invalid write of size 4
==34783== by 0x21B719: swscanf
Address 0x100004000 is 0 bytes inside a block of size 3 alloc'd

当我在长度为 6 的十六进制字符串上运行您的代码时出现此错误:

BYTE *ba = HexStrToByteArray(L"123456");

当然,这应该产生 3 个字节。但是,%02x 转换说明符使 swscanf() 期望指向 unsigned int 的指针(在您的实现中恰好是 4 个字节长) ,而您传递给它的是 BYTE *,它可能是指向 unsigned char 的指针。


与其尝试乱用 scanf(),这很糟糕,不如使用 strtoul()。此外,使用 std::size_t 作为大小,请不要用 float 污染整数运算。此外,如果您的十六进制字符串是奇数个字符,您将需要为其分配一个额外的字节。此外,我建议您通过 const 引用传递输入字符串,以避免不必要的复制。

BYTE *HexStrToByteArray(const std::wstring &hex_str)
{
std::size_t len = (hex_str.size() + 1) / 2;
char buf[3] = { 0 };
BYTE *bytearray = new BYTE[len];

for (std::size_t i = 0; i < len; i++) {
buf[0] = hex_str[2 * i + 0];
buf[1] = hex_str[2 * i + 1];
bytearray[i] = std::strtoul(buf, NULL, 16);
}

return bytearray;
}

关于c++ - 为什么我在这个简单的代码中有 HEAP CORRUPTION?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21016291/

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