Pergunta

Por favor, não me crucifique para este. Eu decidi que poderia ser bom usar um char* porque a corda que eu pretendia construir era de tamanho conhecido. Também estou ciente de que, se o timeinfo-> tm_hour retornar algo diferente de 2 dígitos, as coisas vão dar errado. Dito isto, quando essa função retorna o Visual Studio me atende a uma corrupção de heap. O que está dando errado? (Além disso, devo apenas usar um 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;
}
Foi útil?

Solução

Você precisa alocar mais um byte, já que .length de um string Retorna seu comprimento sem o término da NUl, para o qual você também precisa de espaço no char*.

Isto é, suponha Message.length() Retorna 10. Você aloca 21 bytes. Copie 11 bytes no buffer e copie a mensagem, que precisa de 10 bytes + um para NUL. Total: 22 bytes, e você só tem 21 alocados.

Outras dicas

este

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

deveria estar

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

Porque você está adicionando 11 Char adicional para o buffer:

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

você precisa de um adicional para o término null Caracteres.

Como outros apontaram, o tamanho de MessageBuffer precisa ser aumentado em um.

No entanto, em vez de lidar com o buffer de char bruto dessa maneira, você pode simplesmente transmitir as informações de tempo diretamente para _file sem colocá -lo em uma string intermediária primeiro. Se você quiser em uma string intermediária por algum motivo, eu sugiro que você use o uso do ostringstream classe.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top