gpt4 book ai didi

c++ - 是什么导致我的方法中堆损坏?

转载 作者:行者123 更新时间:2023-11-30 16:08:30 24 4
gpt4 key购买 nike

所以我已经将恼人的堆损坏追踪到了一个方法。

DWORD gdwCounter = 0;

TCHAR* GetName(const TCHAR* format, size_t len)
{
len += (snprintf(NULL, 0, "%lu", gdwCounter) * sizeof(TCHAR));
TCHAR *c = (TCHAR*)malloc(len);
_stprintf_s(c, len, __TEXT("%s%lu"), format, gdwCounter);
return c;
}

为了确保找到正确的方法,我尝试更改它,并将其作为参数传递到输出缓冲区的“格式”缓冲区复制。堆损坏消失了,一切又恢复正常了。

我决定查看 snprintf 的文档和 _stprintf_s

snprintf 应该返回所需的字符,不带空终止字符,以便在第二次调用时实际打印缓冲区。

我的len参数已包含格式的完整大小(带有空终止字符)。

此外,我在 _stprintf_s 的文档中找不到任何错误提示。

那么我错过了什么?

编辑:经过进一步测试,我发现显然 _stprintf_s 导致了错误,因为 snprintf 确实返回了正确的大小。

最佳答案

TCHAR* GetName(const TCHAR* format, size_t len)
{
len += snprintf(NULL, 0, "%lu", gdwCounter);
TCHAR *c = (TCHAR*)malloc(len*sizeof(TCHAR));
_stprintf_s(c, len, __TEXT("%s%lu"), format, gdwCounter);
return c;
}

_stprintf_s采用“要存储的最大字符数”而不是最大字节数。

关于c++ - 是什么导致我的方法中堆损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59334398/

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