Вопрос

Пожалуйста, не распящая меня за этому. Я решил, что это может быть приятно использовать символ *, потому что строка, которую я намеревался построить, был из известного размера. Я также знаю, что если TimeInfo-> TM_Hour возвращает что-то, кроме 2 цифр, все собираются пойти неправильно. Это сказано, когда эта функция возвращает 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 байтов + один для нула. Всего: 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 Char.

Как другие указали, размер MessageBuffer должен быть увеличен одним.

Однако, вместо того, чтобы иметь дело с буфером RAW Char таким образом, вы могли бы просто потирать информацию о времени напрямую _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