Question

S'il vous plaît ne me crucifient pas pour celui-ci. J'ai décidé qu'il pourrait être bon d'utiliser un char * parce que la chaîne que je voulais construire était d'une taille connue. Je suis également conscient que si timeinfo-> tm_hour rendement autre chose que 2 chiffres, les choses vont mal tourner mal. Cela dit, lorsque cette fonction retourne en studio va singe VIsual à moi de CORRUPTION HEAP. Qu'est-ce qui ne va pas? (Aussi, dois-je simplement utiliser 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;
}
Était-ce utile?

La solution

Vous devez allouer un octet, puisque .length d'un string retourne sa longueur sans NUL de terminaison, pour lequel vous avez aussi besoin d'espace dans le char*.

i.e.. supposons que revient Message.length() 10. Vous allouer 21 octets. Copier 11 octets dans la mémoire tampon, puis copiez le message, qui a besoin de 10 octets + un pour NUL. Total:. 22 octets, et que vous avez alloué seulement 21

Autres conseils

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

doit être

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

Parce que vous ajoutez 11 ombles supplémentaire au tampon:

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

vous avez besoin d'un supplémentaire pour la terminaison null car.

Comme d'autres ont des pointes, la taille des besoins de MessageBuffer augmentent d'un.

Cependant, plutôt que de traiter avec le tampon char brut de cette façon, vous pouvez simplement diffuser l'information de temps directement à _file sans le mettre dans une chaîne intermédiaire première. Si vous le souhaitez dans une chaîne intermédiaire pour une raison quelconque, je vous suggère de faire usage de la 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();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top