2010-04-19 7 views
2

S'il vous plait, ne me crucifiez pas pour celui-ci. J'ai décidé qu'il pourrait être bon d'utiliser un caractère car la chaîne que je voulais construire était de taille connue. Je suis également conscient que si timeinfo-> tm_hour renvoie quelque chose d'autre que 2 chiffres, les choses vont mal tourner. Cela dit, lorsque cette fonction retourne VIsual Studio va à mon encontre à propos de HEAP CORRUPTION. Qu'est-ce qui ne va pas? (Aussi, dois-je simplement utiliser un stringbuilder?)Pourquoi suis-je en train de subir une 'corruption de tas'?

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; 
} 
+0

On dirait que vous oubliez le NUL à la fin de la chaîne. Au loin par un. – jrockway

+0

@jrockway Est-ce que Message.c_str() ne va pas ajouter le caractère nul? – User2400

+2

'/ moi prépare ongles et marteau' –

Répondre

7

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

I.e. Supposons que Message.length() renvoie 10. Vous allouez 21 octets. Copiez 11 octets dans le tampon, puis copiez le message, qui nécessite 10 octets + un pour NUL. Total: 22 octets, et vous avez seulement 21 alloués.

+0

Bien sûr! Si simple. :) – User2400

+2

@Michael: son dernier appel est un 'strcpy', qui * met * un NUL à la fin –

+0

en effet .. commentaire supprimé. –

3

Ce

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

devrait ê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.

1

Comme d'autres l'ont souligné, la taille de MessageBuffer doit être augmentée de un. Cependant, plutôt que de traiter le tampon de caractère brut de cette manière, vous pouvez simplement diffuser directement les informations temporelles à _file sans les placer d'abord dans une chaîne intermédiaire. Si vous le souhaitez dans une chaîne intermédiaire pour une raison quelconque, je vous suggère d'utiliser 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(); 
} 
Questions connexes