是什么导致了我的方法中的堆损坏?
What causes the heap corruption in my method?
所以我已经追踪到一个恼人的堆损坏是一个方法。
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;
}
为了确保我找到了正确的方法,我尝试更改它并复制它作为参数传递给输出缓冲区的 'format' 缓冲区。堆损坏消失了,一切都恢复正常了。
我决定查看 snprintf and _stprintf_s 的文档。
snprintf 应该 return 没有空终止字符的所需字符,以便在第二次调用时实际打印缓冲区。
我的 len 参数已经包含 format.
的完整大小(带有空终止字符)
此外,我在 _stprintf_s.
的文档中找不到任何错误提示
所以我错过了什么?
编辑:经过进一步测试,我发现显然 _stprintf_s 会导致错误,因为 snprintf 会 return 正确的大小。
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 采用“要存储的最大字符数”而不是最大字节数。
所以我已经追踪到一个恼人的堆损坏是一个方法。
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;
}
为了确保我找到了正确的方法,我尝试更改它并复制它作为参数传递给输出缓冲区的 'format' 缓冲区。堆损坏消失了,一切都恢复正常了。
我决定查看 snprintf and _stprintf_s 的文档。
snprintf 应该 return 没有空终止字符的所需字符,以便在第二次调用时实际打印缓冲区。
我的 len 参数已经包含 format.
的完整大小(带有空终止字符)此外,我在 _stprintf_s.
的文档中找不到任何错误提示所以我错过了什么?
编辑:经过进一步测试,我发现显然 _stprintf_s 会导致错误,因为 snprintf 会 return 正确的大小。
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 采用“要存储的最大字符数”而不是最大字节数。