[c] Zwalnianie pamieci

0

Witam :) Czy moglby mi ktos sprawdzic czy dobrze zwalniam pamiec ?

mam liste:

struct lista{
       void *dane;
       struct lista *next;
       struct lista *prev;
};

dane to kilka roznych struktur np:

struct Sproc{//Procesor
   char *producent;
   char *typ;
   char *model;
   char *gniazdo;
   int   szybkosc;
   int   cena;
};

struct Sram{//Pamiec RAM
   char *producent;
   char *rodzaj;
   char *standard;
   int   pojemnosc;
   int   cena;
};

i teraz funkcje zwalniające pamiec:

//funkcje zwalniajace pamiec
void zwolnij_liste(struct lista **korzen,void(*zwolnij)(void *))
{
    struct lista *tmp,*tmp1;
    tmp = tmp1 = *korzen;
    while(tmp!=NULL)
    {
        tmp = tmp->next;
        (*zwolnij)(tmp1->dane);
        free(tmp1);
        tmp1 = tmp;
    }
    *korzen = NULL;
}
void zwolnij_proc(struct Sproc *procesor)
{
    free(procesor->producent);
    free(procesor->typ);
    free(procesor->model);
    free(procesor->gniazdo);
}

void zwolnij_ram(struct Sram *ram)
{
    free(ram->producent);
    free(ram->rodzaj);
    free(ram->standard);
}

void zwolnij_bez_danych(void *dane)
{
 //powinna dzialac tak, ze usunie sie lista a dane zostaja (2 lista ktora ma podpiete dane z pierwszej)
}
void zwolnij_pamiec()
{
    zwolnij_liste(&pkorzen,(void(*)(void*))zwolnij_proc);
    zwolnij_liste(&pkorzen,(void(*)(void*))zwolnij_ram);
}

Chcialem zapytac czy zwalnianie pamieci jest zrobione dobrze , czy nie ma nigdzie wycieku ? Bo juz sam sie zaplatalem w tym.

0

Do sprawdzenia czy w programie nie ma wycieków możesz użyć Valgrinda (albo jakiegoś GC dla C).

0

a pod windowsa cos ? bo pod linuxem tego nie skompiluje bo mam windows.h ;/

a tak sie zastanawiam czy nie powinno byc to tak:
funkcja zwalniajaca dane:

void zwolnij_proc(struct Sproc **procesor)
{
free((*procesor)->producent);
free((*procesor)->typ);
free((*procesor)->model);
free((*procesor)->gniazdo);
free(*procesor);
}

jak bedzie prawidlowo tak czy tak jak przedtem ? Myslalem zeby to zrobic w tej glownej petli zwlanianie tej struktury dane ale mam 2 liste (kopie a tam sa wskazniki na dane) i pozniej jak chce nią wyczyscic to moge uzyc tej funkcji zwolnij_liste i przekazac jej do zwalniania danych pustą funkcje (wiec dane w glownej liscie dalej pozostana)

tam wywolanie tego chyba by musialo byc wtedy tak:
(*zwolnij)(&tmp1->dane);

i

void zwolnij_liste(struct lista **korzen,void(*zwolnij)(void **))

ktora wersja bedzie prawidlowo zwalniala te pamiec ?

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