Problem w zrozumieniu wycieku pamięci

0

Witam.Pisząc projekt w c natrafiłem na wyciek pamięci za pomocą drMemory.Oto co wyrzucił program

Error #1: LEAK 108 direct bytes 0x01181668-0x011816d4 + 0 indirect bytes

0 replace_malloc [d:\drmemory_package\common\alloc_replace.c:2576]

1 CreateKeyElem [A:/workspace/workspace_c/projekt_c/v9_pamiec/próbA/main.c:32]

2 GetCode [A:/workspace/workspace_c/projekt_c/v9_pamiec/próbA/main.c:215]

3 GetCode [A:/workspace/workspace_c/projekt_c/v9_pamiec/próbA/main.c:206]

4 EncryptFile [A:/workspace/workspace_c/projekt_c/v9_pamiec/próbA/main.c:285]

5 main [A:/workspace/workspace_c/projekt_c/v9_pamiec/próbA/main.c:394]

Przechodząc do linii 32(jak mniemam po tym łańcuszku tak powinienem zrobić)dochodze do funkcji,która alokuje pamięć na strukture,inicjuje jej pola i zwraca wskaźnik

struct keyElem* CreateKeyElem(char tab[],char x)// tworzy element listy z kluczami
{
    struct keyElem* temp = (struct keyElem*)malloc(sizeof(struct keyElem)); //linia 32
    strcpy(temp->key,tab);
    temp->data = x;
    temp->next = NULL;
    return temp;
}

Nie mogę tu zrobić free(temp); bo wtedy funkcja mijała by się z celem.Zamiast tego mam funkcje,która po przemieleniu struktur usuwa liste(stworzoną z tych struktur)

void DeleteList(struct keyElem* guard)
{
    struct keyElem* temp0;

    while(guard->next != NULL)
    {
       temp0 = guard->next;
       guard->next = guard->next->next;
       free(temp0);
    }

}

Ktoś domyśla się co robie źle?A może źle interpretuje komonikat drMemory?

1

strcpy(temp->key,tab); Nigdzie nie alokujesz pamięci dla key. Czy jest to tablica znaków?

Nie zwalniasz pierwszego elementu listy w DeleteList. Czy to intencjonalne?

0

Ohh zapomniałem dodać jeszcze struktury.

struct keyElem
{
    char key[100];
    char data;
    struct keyElem* next;
};

A pierwszy element zwalniam.Lista zaczyna sie od guard->next.Zmienną guard zwalniam później.

0

Ale czy alokując pamięć na strukture w której jest tablica to nie alokuje ona też pamięci na tą tablice?

0

Tak, alokujesz, dlatego pytam, a nie stwierdzam, że to błąd. Równie dobrze mogłeś mieć char* key i wtedy błędem to by było.

0

Więc wiesz może gdzie jest powód wycieku?

0

Zwalniasz wszystko oprocz guard, moze to i dobrze, ciezko powiedziec, bo nie znam reszty programu, ale to jest podejrzane miejsce.

0

Nie chciałem wrzucać całego bo to dosyć długi kawałek kodu.Niemniej jeżeli ktoś jest tak uczynny i chce to przejrzeć to dodaje w załączniku

1

Napisz to jak biały człowiek:

void DeleteList(struct keyElem* guard)
{
    struct keyElem* temp0;
    struct keyElem* elem;

    elem = guard;

    while(elem != NULL)
    {
       temp0 = elem;
       elem = elem->next;
       free(temp0);
    }
}

To nic nie zmieni w wycieku (nie powinno), ale lepiej się będzie czytać.

0

A widze, mieszasz wskazniki i statyczne, projekt słaby, więc pomysł, który podsunął @vpiotr nie pomoże. ALe ja tu widze UB z deklaracją
char c[0] = {""}; a potem wpisywanie tam wartosci....

1

No dobra, tak naprawdę to jednak tego keyGuarda nie zwalniasz bo jest statyczny.
Za to chyba zwalniasz NULL który siedzi w keyGuard.next (co jest akceptowalne tylko nie wiadomo po co to robisz: https://stackoverflow.com/questions/6084218/is-it-good-practice-to-free-a-null-pointer-in-c).

  1. zrób jak napisałem wyżej
  2. usuń linię (ona zwalnia NULL):
free(keyGuard.next);
  1. zmień alokację keyGuard na dynamiczną

Nawet jak nie pomoże to kod się uprości.

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