【问题标题】:Application freezes when freeing memory释放内存时应用程序冻结
【发布时间】:2012-09-22 16:09:19
【问题描述】:

我有以下代码,我尝试将字符串03080000 转换为字节数组,第一个字节为 03,第二个为 08,第三个为 00,第四个为 00。

但是当我释放内存时它一直冻结。
我尝试使用调试器(Visual Studio)单步执行它,但是当我跨过 free() 函数时,调试器似乎停止了,它只是挂起。

我写信的方式是否破坏了bData?或者有什么问题?

LPCWSTR lpValueData = L"03080000"
WCHAR HexChar[2] = {0};

UINT i;
UINT n = 0;

DWORD dwDataSize;
PBYTE bData;

dwDataSize = wcslen(lpValueData) / 2;
bData = (PBYTE) malloc(dwDataSize);
for (i = 0; i < dwDataSize * 2; i += 2)
{
    HexChar[0] = lpValueData[i];
    HexChar[1] = lpValueData[i + 1];

    swscanf_s(HexChar, L"%X", &bData[n++]);
}
// I want bData to be {0x03, 0x08, 0x00, 0x00}
// Compare bData to another byte array here with memcmp
free(bData); // freezes here.

【问题讨论】:

  • 你不能使用strdupwcsdup 吗?而malloc 应该得到(dwDataSize * sizeof(WCHAR))。而且你的代码不是标准的 C,它是 Windows 特定的,所以应该这样标记(例如,它不会在 Posix 系统或 Linux 上编译)。
  • 你的malloc 应该得到字节数。我错了,您可能至少需要 (dwDataSize+1) * sizeof(WCHAR) 甚至更多。

标签: c windows memory malloc free


【解决方案1】:

L"%X" 请求指向 int 的指针,而不是 BYTE

所以,应该是

int x;
swscanf_s(HexChar, L"%X", &x);
bData[n++] = x;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多