题
请不要钉死我这一个。我决定它可能是很好用的一个char *,因为我建意字符串是一个已知的大小。我也知道,如果超过2个位数其他timeinfo-> tm_hour回报的东西,事情要去严重错误。这就是说,当这个函数返回的Visual Studio去猿我大约堆损坏。什么错? (另外,我应该只是使用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;
}
解决方案
您需要分配一个多字节,因为.length
的string
返回其长度而不终止NUL,为此还需要在char*
空间。
即。假设Message.length()
回报10.你分配21个字节。 11个字节复制到缓冲区,然后复制该消息,这需要10个字节+一个NUL。总计:22个字节,而你只有21分配
其他提示
此
char* MessageBuffer = new char[Message.length()+11];
应
char* MessageBuffer = new char[Message.length()+12];
由于要添加额外11
炭到缓冲器:
2 for hr
2 for ::
2 for min
2 for ::
2 for sec
1 for " "
需要一个附加到用于终止null
炭。
作为其他人指出,的MessageBuffer
需要的大小来增加一。
不过,而不是处理那样的原始字符缓冲区,你可以只直接流的时间信息,以_file
没有把它变成一个中间字符串第一。如果你想在出于某种原因中间串,我建议你利用ostringstream
类的。
void writelogmessage(std::string Message)
{
time_t rawtime;
struct tm* timeinfo = 0;
time(&rawtime);
timeinfo = localtime(&rawtime);
std::ostringstream stream;
stream<<
timeinfo->tm_hour<<"::"<<
timeinfo->tm_min<<"::"<<
timeinfo->tm_sec<<" "<<
Message;
_file<<stream.str();
}
不隶属于 StackOverflow