c++ - 为什么我得到 'Heap Corruption' ?

标签 c++ heap-corruption

请不要为了这个把我钉在十字架上。我决定使用 char* 可能更好,因为我打算构建的字符串的大小已知。我还知道,如果 timeinfo->tm_hour 返回的不是 2 位数字,那么事情就会变得很糟糕。就是说,当此函数返回时,VIsual Studio 就 HEAP CORRUPTION 向我大发雷霆。出了什么问题? (另外,我应该只使用 stringbuilder 吗?)

void cLogger::_writelogmessage(std::string Message)
{
    time_t rawtime;
    struct tm* timeinfo = 0;

    time(&rawtime);
    timeinfo = localtime(&rawtime);

    char* MessageBuffer = new char[Message.length()+11];
    char* msgptr = MessageBuffer;

    _itoa(timeinfo->tm_hour, msgptr, 10);
    msgptr+=2;

    strcpy(msgptr, "::");
    msgptr+=2;

    _itoa(timeinfo->tm_min, msgptr, 10);
    msgptr+=2;

    strcpy(msgptr, "::");
    msgptr+=2;

    _itoa(timeinfo->tm_sec, msgptr, 10);
    msgptr+=2;

    strcpy(msgptr, " ");
    msgptr+=1;

    strcpy(msgptr, Message.c_str());

    _file << MessageBuffer;

    delete[] MessageBuffer;
}

最佳答案

您需要再分配一个字节,因为 string.length 返回其长度而没有终止 NUL,为此您还需要在 中留出空间字符*

即假设 Message.length() 返回 10。您分配了 21 个字节。将 11 个字节复制到缓冲区中,然后复制消息,这需要 10 个字节 + 一个用于 NUL。总计:22 个字节,而您只分配了 21 个。

关于c++ - 为什么我得到 'Heap Corruption' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2665931/

相关文章:

c++ - 没有从 std::function 到 bool 的可行转换

c++ - 使用智能卡签名时指定给 RtlFreeHeap 的地址无效 (C++)

c++ - 使用查找和替换程序检测到堆损坏

c++ - 阵列包装损坏堆

c++ - 写入文件时出现堆损坏

c++ - cout C++ 期间出现堆错误

c++ - 关于结合使用 extern 和 const 的变量的问题

c++ - std::gcd 无法在 g++ 5.4.0 中编译 - 'gcd' 不是 'std' 的成员

c++ - 在 C/C++ 中声明这些类型的表的简洁方法?

c++ - 来自加权 Delaunay 三角剖分的 Alpha 形状