Проблема памяти связанного списка - PullRequest
1 голос
/ 10 марта 2019

На самом деле я работаю над проектом по манипулированию связанными списками, и все работает отлично, но когда я запускаю его с помощью valgrind, я вижу, что есть много проблем с памятью. Я помещаю здесь часть кода, где я думаю, что проблема с выделенной памятью такова, что, возможно, вы поможете мне выяснить это.

Итак, мне нужно прочитать из файла этого формата:

19971230 20220512 ALklklklk
19970905 20001203 BDHE UNE
20151212 20301123 CLEUSHI
20171221 20301025 DE klkllLU TOPI
20160315 20190227 Ehaaaa

и поместите их в связанный список, представленный этой структурой:

typedef struct cell{
    int dateDeb;
    int dateFin;
    char text[TAILLE_MAX];
    struct cell * suivant;
}message;

Вначале я кодировал эту функцию для инициализации блока списка:

message * creationCellule(){

    message * cellule;
    cellule = (message *)malloc(sizeof(message));

    if(cellule != NULL)
    {
        cellule -> dateDeb = 0;
        cellule -> dateFin = 0;
        cellule -> suivant = NULL;
        memset(cellule->text, '\0', TAILLE_MAX);
    }
    return cellule;

}

И функция для чтения из файла:

void lectureFichier(const char * nomFichier, message ** tete)
{


    FILE * fp = fopen(nomFichier, "r");
    message * test;
    test = creationCellule();

    if(fp != NULL)
    {

        while(fscanf(fp,"%d %d ", &(test->dateDeb), &(test->dateFin)) == 2)
        { 
            fgets(test -> text, 100, fp);

            insertion(tete, test);
            test =  creationCellule(test);

        }
    }
    fclose(fp);                                                                                                                                                                          
}

Вот эта функция вставки:

void insertion(message ** tete, message * cellule){

    message ** prec;


    if(cellule != NULL){
            prec = recherche(tete, cellule -> dateDeb);
            cellule -> suivant = *prec;
            *prec = cellule;
    }

} 

Valgrind сообщает мне, что произошла утечка памяти и динамически выделенная память не освобождается. И это правильно, потому что я ничего не освобождаю в этих функциях, но я не знаю, где использовать free, потому что мне нужно повторно использовать это внутри цикла. Вот результат Valgrind: введите описание изображения здесь

Не могли бы вы показать мне решение, как решить эту проблему, потому что я застрял в этом. Даже если мне нужна функция creationCellule, все в порядке. Это не обязательно писать это. Огромное спасибо заранее !

1 Ответ

0 голосов
/ 10 марта 2019

Нет проблем при создании списка ссылок. Однако, как только вы закончите чтение файла и списка ссылок, вам нужно освободиться. Помните, что если вы использовали malloc (), вы должны вызвать free (), чтобы освободить память. Примерно так - freeCellule (), вы можете вызвать эту функцию перед возвратом из lectureFichier ():

   void freeCellule(message *ptr)
   {
       message * next;
       while (ptr) {
           next = ptr->suivant;
           free(ptr);
           ptr = next;

      }
   }
...