Warum bekomme ich ‚Heap Corruption‘?
-
27-09-2019 - |
Frage
Bitte kreuzigen mich nicht für diese ein. Ich beschloss, es könnte gut sein, ein Zeichen zu verwenden *, da die Zeichenfolge ich bestimmt Build von einer bekannten Größe ist. Ich bin mir auch bewusst, dass, wenn timeinfo-> tm_hour kehrt etwas anderes als zwei Ziffern, die Dinge laufen schief gehen. Dies vorausgeschickt, wenn diese Funktion von Visual Studio geht Affe mich über Heapbeschädigung zurückgibt. Was läuft da falsch? (Auch soll ich nur einen Stringbuilder verwenden?)
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;
}
Lösung
Sie benötigen ein weiteres Byte zuzuweisen, da .length
eines string
gibt seine Länge ohne das abschließende NUL, für die Sie auch benötigen Platz im char*
.
d. suppose Message.length()
Renditen 10. Sie ordnen 21 Byte. Kopieren 11 Byte in den Puffer, dann die Nachricht kopieren, die 10 Bytes + eine für NUL muss. Insgesamt wurden. 22 Bytes, und Sie haben nur 21 zugewiesen
Andere Tipps
Das
char* MessageBuffer = new char[Message.length()+11];
sollte
char* MessageBuffer = new char[Message.length()+12];
Weil Sie hinzufügen 11
zusätzliche Zeichen in den Puffer:
2 for hr
2 for ::
2 for min
2 for ::
2 for sec
1 for " "
Sie müssen eine zusätzliche für den Abschluss null
char.
Wie andere haben darauf hingewiesen, die Größe der MessageBuffer
Bedürfnisse um eins erhöht werden.
Doch anstatt auf diese Weise mit dem rohen char buffer tun hat, könnten Sie einfach die Zeit, Informationsstream direkt an _file
, ohne sie zunächst in einen Zwischen Zeichenfolge zu setzen. Wenn Sie es in einem Zwischen Zeichenfolge aus irgendeinem Grunde wollen, würde ich vorschlagen, dass Sie von der ostringstream
Klasse.
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();
}