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;
}
È stato utile?

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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top