在释放内存时堆损坏



我有一个函数为char* c变量分配内存,然后释放它。调试时出现错误:

---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Debug Error!
HEAP CORRUPTION DETECTED: after Normal block (#95) at 0x0130BE00.
CRT detected that the application wrote to memory after end of heap buffer.

我做错了什么?

void logHex(char* value, int len, int level)
{
if (LogHnd)
{
char* c = (char*)calloc(len * 3, 1);
for (int i = 0; i < len; i++)
{
sprintf(c, "%s%02X ",c,value[i]);
}
LogHnd(c, level);
free(c);
}
}

sprintf中使用相同的指针作为源和目标会导致未定义行为

在c++中使用std::string来满足所有字符串的需要,然后你可以使用普通的+操作符来附加字符串。

要格式化字符串,请使用std::ostringstream,格式库或std::format(如果您的编译器足够新)。


使用std::ostringstream,可以是这样的:

std::string c;
for (int i = 0; i < len; ++i)
{
c += (std::ostringstream{} << std::hex << std::setw(2) << std::setfill('0') << static_cast<unsigned>(value[i])).str();
}

使用std::format可以是这样的:

std::string c;
for (int i = 0; i < len; ++i)
{
c += std::format("{:02x}", static_cast<unsigned>(value[i]));
}

与格式库相同,但使用fmt命名空间而不是std

注意,我将value[i]中的char值转换为unsigned整数,因为如果char是有符号的或无符号的,它是实现定义的。如果char是有符号的,那么0x7f以上的值将被认为是负的,并导致符号扩展,这将在值中添加许多f的十六进制数字。

相关内容

  • 没有找到相关文章

最新更新