Poprawne zwolnienie pamięci

0

Mam problem ze zwolnieniem pamięci.

Mam funkcje która sortuje przez wstawianie, elementy do listy dwukierunkowej, lecz po zakończeniu programu mam raport, który wskazuje na wyciek pamięci przy właśnie tej fukncji.

Próbowałem dać

free(tmp) pod koniec funkcji, lecz przez to niewiedzieć czemu głowa listy mi się traci i podczas debugowania ma adres "0xfeefee", co powoduje wywalenie programu, lecz wycieku już nie ma.

typedef struct el_listy
                {
                        struct  zespol dane;
                        struct el_listy *next;
                        struct el_listy *poprz;
                        struct podwieszana *next2;
                }el_listy;


struct el_listy *glowa=NULL;
struct el_listy *ogon=NULL;



void dodaj_zespol (struct zespol dane_zesp,int *licznik){
   struct el_listy *nowy=NULL;
   struct el_listy *tmp=glowa;
   nowy = (el_listy*)malloc(sizeof(el_listy));
   if (glowa==NULL){
    nowy->dane = dane_zesp;
   nowy->next = NULL;
   nowy->poprz= NULL;
   nowy->next2=NULL;

   glowa=nowy;
   ogon=nowy;
   

      }


    else{  
        nowy->dane = dane_zesp;
        if ((strcmp(glowa->dane.nazwa, nowy->dane.nazwa))>0){
            nowy->next = glowa;
            glowa->poprz=nowy;
            nowy->poprz=NULL;
             nowy->next2=NULL;
             glowa=nowy;
        }
        else{
           while ((tmp->next!=NULL)&&((strcmp(tmp->dane.nazwa, nowy->dane.nazwa) < 0)))
                tmp=tmp->next;
           nowy->poprz = tmp;
           nowy->next = tmp->next;
           nowy->next2=NULL;
           if (tmp->next != NULL){
                tmp->next->poprz = nowy;
                tmp->next = nowy;
            }
            else{
                nowy->next=NULL;
                tmp->next = nowy;
                ogon=nowy;
				
            }



        }
    }

	(*licznik)++; 
     // tu dawałem free(tmp)
}

0

Przede wszystkim używaj new i delete zamiast malloc i free. I popracuj nad wyglądem kodu, wcięcia, klamry w odpowiednich miejscach i spacje przed i po "=", bo tego nie chce się czytać.

0

Zwalnianie pamięci jest banalnie proste - zwalniasz to co przydzieliłeś.

0

Dobrze jest zwalniać pamięc zaraz po jej przydziale tj. zamykać blok klamrą '}' zaraz po otwarciu '{'.

0

Ok poradziłem sobie, musiałem napisać osobną funkcje do usuwania listy, przed zamknięciem programu. Memleak zniknął.

1 użytkowników online, w tym zalogowanych: 0, gości: 1