Pregunta

Por favor, no me crucifican para éste. Decidí que sería bueno utilizar un char * porque la cadena tenía la intención de construir era de un tamaño conocido. También soy consciente de que si timeinfo-> tm_hour vuelve algo distinto de 2 dígitos, las cosas van a salir muy mal. Dicho esto, cuando esta función devuelve Visual Studio va mono conmigo por daños en el montón. Lo que va mal? (También, debería sólo tiene que utilizar un 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;
}
¿Fue útil?

Solución

Es necesario asignar una más bytes, ya que .length de un string devuelve su longitud sin la terminación NUL, por lo que también necesita espacio en el char*.

es decir. vuelve Message.length() supongamos 10. Se asignan 21 bytes. Copiar 11 bytes en el buffer, luego copia el mensaje, que necesita 10 bytes + uno para NUL. Total:. 22 bytes, y sólo se han asignado 21

Otros consejos

Este

char* MessageBuffer = new char[Message.length()+11];

debería ser

char* MessageBuffer = new char[Message.length()+12];

Debido a que está añadiendo 11 carbón adicional a la memoria intermedia:

2 for hr
2 for ::
2 for min
2 for ::
2 for sec
1 for " "

necesita uno adicional para el carbón de terminación null.

Como otros han apuntado a cabo, el tamaño de las necesidades MessageBuffer que se incrementa en uno.

Sin embargo, en lugar de tratar con el char buffer prima de esa manera, sólo podría transmitir la información de tiempo directamente a _file sin ponerlo en una cadena intermedia primero. Si usted quiere que en una cadena intermedia, por alguna razón, me permito sugerir que usted hace uso de la clase 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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top