请不要钉死我这一个。我决定它可能是很好用的一个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;
}
有帮助吗?

解决方案

您需要分配一个多字节,因为.lengthstring返回其长度而不终止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();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top