请不要为了这个把我钉在十字架上。我决定使用 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/