2010-08-05 4 views
4

J'essaie de diviser une chaîne en phrases (délimitées par des délimiteurs de phrases). Le code lui-même fonctionne mais je continue d'avoir des fuites de mémoire dans la fonction.Fuite de mémoire lors de la division de phrases avec strtok

char ** splitSentences(char *string) { 

int sentencecount = 0; 
char* buf = NULL; 
char* str = NULL; 

buf = malloc((strlen(string) + 1) * sizeof(char)); 
strcpy(buf,string); 

str = buf; 

sentencecount = countSentences(str); 

if(sentencecount != 0) 
{ 
    char** sentences = NULL; 
    sentences = malloc((sentencecount + 1)*sizeof(char*)); 
    memset(sentences,0,sentencecount+1); 

    char* strToken = NULL; 
    strToken = malloc((strlen(str)+1)*sizeof(char)); 
    memset(strToken,0,strlen(str)+1); 

    strToken = strtok(str, SENTENCE_DELIMITERS); 

    int i = 0; 

    while(strToken != NULL) { 
     sentences[i] = NULL; 
     sentences[i] = malloc((strlen(strToken)+1)*sizeof(char)); 
     strncpy(sentences[i], strToken,strlen(strToken) + 1); 
     strToken = strtok(NULL, SENTENCE_DELIMITERS); 
     i++; 
    } 

    sentences[sentencecount] = NULL; 

    //Free the memory 
    free(strToken); 
    strToken = NULL; 

    free(buf); 
    buf = NULL; 

    return sentences; 
} 

return NULL; 

}

Je ne trouve pas pourquoi il fuites de mémoire. Est-ce que quelqu'un sait?

+0

vous pouvez également combiner toutes vos combinaisons 'malloc/memset' aux appels à' calloc', rendrait votre code plus facile à capturer. –

+1

Vous appelez malloc() quatre fois et free() deux fois. Vous devez libérer() tout ce que vous malloc(). – Dingo

Répondre

9

est ici une fuite de mémoire:

strToken = malloc((strlen(str)+1)*sizeof(char)); 
// ... 
strToken = strtok(str, SENTENCE_DELIMITERS); 

Vous allouez de l'espace pour un objet avec malloc, puis perdre le pointeur sur cet espace après avoir appelé strtok.

+0

Ça marche! Merci beaucoup! – Moox

1

vous malloc phrases et return à l'appelant. Le libérez-vous là?

1

strtok() renvoie un pointeur sur le jeton trouvé dans la chaîne. Dans votre exemple, je ne crois pas que vous ayez besoin d'allouer la variable strToken (c'est juste un pointeur). Essayez de supprimer:

strToken = malloc((strlen(str)+1)*sizeof(char)); 
memset(strToken,0,strlen(str)+1); 
0

Vous ne devriez pas chaîne malloc qui est utilisée pour contenir la valeur de retour de strtok. Vérifiez la référence pour strtok. D'où le memleak.