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

标签 c++ c heap-corruption

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

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/

相关文章:

python - Propellerheads 的 NN-XT 文件格式 : Problems with REFE chunk

c++ - 返回一个 long long 值

c++ - 遇到小于 n 的简单计数素数问题

C - 检测到堆损坏

c++ - 什么是用于在 C++ 中分配连接的服务器的点对点聊天程序的良好实现?

c++ - 在运行时环境中使用带Lua的C++

c++ - 给定字符串中每个字符出现的次数

c++ - 从转储中获取调用堆栈的几乎所有帧中的 this 指针 NULL 意味着什么?

c++ - 字符串不会用 cout 打印

支持 __LINE__ 宏和其他宏的 C++ 风格记录器