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;
}
War es hilfreich?

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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top