Perché ricevo 'Heap Corruption'?
-
27-09-2019 - |
Domanda
Per favore, non mi crocifiggere per questo. Ho deciso che potrebbe essere buono per usare un char * perché la stringa avevo intenzione di costruire era di dimensioni note. Sono anche consapevole che se timeinfo-> tm_hour restituisce qualcosa di diverso da 2 cifre, le cose stanno andando ad andare male male. Detto questo, quando questa funzione restituisce Visual Studio va scimmia con me per il danneggiamento di heap. Cosa c'è che non va? (Inoltre, devo solo usare uno 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;
}
Soluzione
È necessario allocare un altro byte, dal momento che .length
di un string
restituisce la sua lunghezza senza il NUL di terminazione, per il quale è necessario anche spazio nel char*
.
vale a dire. Message.length()
rendimenti Supponiamo 10. Si allocano 21 byte. Copiare 11 byte nel buffer, quindi copiare il messaggio, che ha bisogno di 10 byte + uno per NUL. Totale:. 22 byte, e si hanno solo 21 stanziati
Altri suggerimenti
Questo
char* MessageBuffer = new char[Message.length()+11];
dovrebbe essere
char* MessageBuffer = new char[Message.length()+12];
Perché si sta aggiungendo 11
char aggiuntivo per il buffer:
2 for hr
2 for ::
2 for min
2 for ::
2 for sec
1 for " "
è necessario un ulteriore per il carattere di terminazione null
.
Come altri hanno fuori appuntito, la dimensione dei bisogni MessageBuffer
essere aumentato di uno.
Tuttavia, piuttosto che fare con il buffer char prima in questo modo, si può solo trasmettere le informazioni direttamente al tempo _file
senza metterlo in una stringa intermedia prima. Se si vuole che in una stringa di intermedio per qualche motivo, vorrei suggerire che si fanno uso della classe 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();
}