Por que estou recebendo 'corrupção de heap'?
-
27-09-2019 - |
Pergunta
Por favor, não me crucifique para este. Eu decidi que poderia ser bom usar um char* porque a corda que eu pretendia construir era de tamanho conhecido. Também estou ciente de que, se o timeinfo-> tm_hour retornar algo diferente de 2 dígitos, as coisas vão dar errado. Dito isto, quando essa função retorna o Visual Studio me atende a uma corrupção de heap. O que está dando errado? (Além disso, devo apenas usar um 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;
}
Solução
Você precisa alocar mais um byte, já que .length
de um string
Retorna seu comprimento sem o término da NUl, para o qual você também precisa de espaço no char*
.
Isto é, suponha Message.length()
Retorna 10. Você aloca 21 bytes. Copie 11 bytes no buffer e copie a mensagem, que precisa de 10 bytes + um para NUL. Total: 22 bytes, e você só tem 21 alocados.
Outras dicas
este
char* MessageBuffer = new char[Message.length()+11];
deveria estar
char* MessageBuffer = new char[Message.length()+12];
Porque você está adicionando 11
Char adicional para o buffer:
2 for hr
2 for ::
2 for min
2 for ::
2 for sec
1 for " "
você precisa de um adicional para o término null
Caracteres.
Como outros apontaram, o tamanho de MessageBuffer
precisa ser aumentado em um.
No entanto, em vez de lidar com o buffer de char bruto dessa maneira, você pode simplesmente transmitir as informações de tempo diretamente para _file
sem colocá -lo em uma string intermediária primeiro. Se você quiser em uma string intermediária por algum motivo, eu sugiro que você use o uso do ostringstream
classe.
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();
}