Почему я получаю «коррупцию кучи»?
-
27-09-2019 - |
Вопрос
Пожалуйста, не распящая меня за этому. Я решил, что это может быть приятно использовать символ *, потому что строка, которую я намеревался построить, был из известного размера. Я также знаю, что если 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();
}