10 votes

Quand dois-je utiliser free() en C ?

Le code fonctionne comme il est censé le faire, bien qu'il ne libère jamais la mémoire allouée par la fonction malloc() .

J'ai essayé de libérer de la mémoire partout où je le pouvais, mais peu importe où je le fais, cela casse le programme. Plus précisément, j'obtiens un "double free or corruption error". Il s'agit plutôt d'une question sur ce que free() y malloc() font-ils réellement ? Tous les problèmes liés à la gratuité se situent dans l'ensemble :

int main(int argc,  char *argv[]){
if(argc!=2){
    exit(1);
}

printf("CSA WC version 1.0\n\n");

int length = strlen(argv[argc-1]);
char file_to_open[length];
strcpy(file_to_open, argv[argc-1]);

//printf("filename:%s\n",file_to_open);

//create counters for output
int count_number_of_lines = 0;
int count_number_of_words = 0;
int count_number_of_characters = 0;

//create int size of default array size
int current_array_size = pre_read(file_to_open);
//printf("number of lines: %i\n",current_array_size);

//create string array of default size
char *strings_array[current_array_size];

//create a pointer to catch incoming strings
char *incoming_string=NULL;

int done=0;
while(done==0){
    incoming_string=get_line_from_file(file_to_open, count_number_of_lines);
    if(incoming_string!=NULL){
        incoming_string=csestrcpy2(incoming_string);
        //printf("incoming line: %s\n",incoming_string);
        strings_array[count_number_of_lines]=(char*)malloc(strlen(incoming_string+1));
        strings_array[count_number_of_lines]=csestrcpy2(incoming_string);
        //printf("added to array:%s\n",strings_array[count_number_of_lines]);
        count_number_of_lines++;
        count_number_of_characters=(count_number_of_characters+(strlen(incoming_string)-1));
    }
    else{
        done=1;
    }

}
//all data is stored in a properly sized array

//count all words in array
int count=0;
int word_count=0;
char *readline;

while(count<current_array_size){
    readline = csestrcpy2(strings_array[count]);
    printf("line being checked: %s", readline);

    int i=0;
    int j=1;

    while( j< strlen(readline)+1 ){
        if(strcmp(readline,"\n")!=0){
            if( (readline[i] == ' ') && (readline[j] != ' ') ){
                word_count++;
            }
            if( (readline[i] != ' ') && (readline[j] == '\n') ){
                word_count++;
            }
        }
        i++;
        j++;
    }
    count++;
}
printf("current word count: %i", word_count);
return 0;
}

char* csestrcpy2(char* src){

int i = 0;
char *dest;
char t;
dest = (char*) malloc(MAX_LINE);

while( src[i] != '\0'){

    dest[i] = src[i];
    i++;

}

dest[i] = '\0';
//printf("length:%i\n",i);
free(dest);

return dest;
}

1 votes

Il n'y a aucune raison de copier file_to_open de argv vous pouvez juste utiliser argv .

0 votes

Curieux de incoming_string=csestrcpy2(incoming_string); S'agit-il simplement d'une fonction de copie de chaîne de caractères ?

2 votes

Aussi, malloc(strlen(str+1)); est presque certainement erronée. Vous vouliez probablement dire malloc(strlen(str)+1); . (Et beaucoup de gens, dont moi, recommandent d'omettre la distribution - void * les pointeurs seront implicitement convertis, et cela peut causer des problèmes potentiels si vous les convertissez explicitement au mauvais type).

0voto

Jan S Points 1396
        i++;
        j++;
        /// free here
        free(readline);
    }
    count++;

}
printf("current word count: %i", word_count);

//free here as well
for(int k = 0; k < count_number_of_lines; k++)
{
    free(strings_array[count_number_of_lines]);
}

return 0;
}

Cela devrait fonctionner.

En général, toute mémoire allouée dynamiquement - en utilisant calloc/malloc/realloc - doit être libérée en utilisant free() avant que le pointeur ne sorte de sa portée.

Si vous allouez de la mémoire en utilisant 'new', vous devez la libérer en utilisant 'delete'.

0 votes

J'ai essayé les deux et ils me donnent tous les deux le double libre ou la corruption (en haut) : 0x088113c8

0 votes

J'ai édité le post. Je suis désolé, le free devrait être juste après les itérateurs, avant le } et non après. aussi strings_array[count_number_of_lines]=(char*)malloc(strlen(incoming_string+1)) ; devrait être strings_array[count_number_of_lines]=(char*)malloc(strlen(incoming_string)+1)) ; ensuite essayez de le freezer comme montré ci-dessus - cela devrait fonctionner

0 votes

Vous avez écrit free(dest) et ensuite vous le rendez ! Il ne renvoie pas de chaîne de caractères. Vous n'avez pas besoin de libérer la mémoire à cet endroit. Si vous la supprimez et la libérez à la fin, cela devrait fonctionner correctement.

0voto

alfonso Points 8420

Cette ligne :

strings_array[count_number_of_lines]=(char*)malloc(strlen(incoming_string+1));

est remplacée par la ligne suivante, elle peut donc être supprimée.

Vous devez également ajouter free(readline) après count++ dans la dernière boucle pour libérer la mémoire créée par malloc.

0 votes

Je ne peux pas supprimer cette ligne ou le tableau de chaînes de caractères ne se remplit jamais. Ainsi, lorsque j'essaie d'accéder au tableau de chaînes de caractères plus tard, ne serait-ce que pour l'imprimer, cela me donne un tableau sans rien dedans ?

0 votes

J'ai aussi essayé d'ajouter ce free et j'ai obtenu : double free ou corruption (top) : 0x088113c8 et le programme s'est arrêté...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X