所以我已经将恼人的堆损坏追踪到了一个方法。
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/