• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista jednokierunkowa

Object Storage Arubacloud
+1 głos
115 wizyt
pytanie zadane 17 lipca 2020 w C i C++ przez kaminie318 Bywalec (2,070 p.)

Witam. Mam pytanie odnośnie usuwania listy jednokierunkowej. Dlaczego podana funkcja usuwająca jest błędna ? Wyskakuje błąd i nie mam pojęcia dlaczego.

void historiaRozgrywek(historiaGry** pGlowa,char* napis)
{
    if (*pGlowa == NULL)
    {
       *pGlowa = (historiaGry*)malloc(sizeof(historiaGry));
       (*pGlowa)->ktoWygral = napis;
       (*pGlowa)->nastepny = NULL;
    }
    else
    {
        historiaGry* kolejnyRekord = (historiaGry*)malloc(sizeof(historiaGry));
        kolejnyRekord->ktoWygral = napis;
        kolejnyRekord->nastepny = *pGlowa;
        *pGlowa = kolejnyRekord;
    }
}


void usunHistorieRozgrywek(historiaGry** pGlowa)
{
    if (*pGlowa)
    {
        usunHistorieRozgrywek((*pGlowa)->nastepny);
        free(*pGlowa);
        *pGlowa = NULL;
    }
}

 

komentarz 17 lipca 2020 przez Wiciorny Ekspert (270,190 p.)
free(*pGlowa);
        *pGlowa = NULL;

zwalniasz wskaźnik, potem ustawiasz na null? 

komentarz 17 lipca 2020 przez kaminie318 Bywalec (2,070 p.)
Słyszałem że tak się robi, aby potem uniknąć "niespodzianek" z pamięcią. Też wydaje mi się to dziwne, ale w każdym bądź razie na pewno nie w tym tkwi problem

2 odpowiedzi

0 głosów
odpowiedź 17 lipca 2020 przez j23 Mędrzec (194,920 p.)
wybrane 17 lipca 2020 przez kaminie318
 
Najlepsza
void usunHistorieRozgrywek(historiaGry* pGlowa)
{
    if (pGlowa) {
        usunHistorieRozgrywek(pGlowa->nastepny);
        free(pGlowa);
    }
}

Użycie rekurencji nie jest dobrym pomysłem. Tym bardziej, że można to w prosty sposób zrobić w pętli while.

komentarz 17 lipca 2020 przez kaminie318 Bywalec (2,070 p.)
mallokiem rezerwuje pamięć, a przyrównanie do nulla jest po to, aby zabezpieczyć się przed wskazaniem na coś, zawsze robiłem tak z listą i działało.
1
komentarz 17 lipca 2020 przez j23 Mędrzec (194,920 p.)

To powoduje wyciek. Przypisanie nulla powoduje, że to, co przydzieliłeś wcześniej, zostaje "zgubione".

Ten malloc jest zbędny, wystarczy przypisanie nulla.

komentarz 17 lipca 2020 przez kaminie318 Bywalec (2,070 p.)

Dziękuję heart W życiu nie wpadłbym na to. Czy to jest jakaś różnica względem c++? Tam zawsze tak robiłem i chyba nigdy nie miałem wycieków z tego powodu. W ogóle teraz jak na to patrze to dziwne wydaje mi się że korzystam z pamięci która nie jest zaalokowana, tylko wskazuje na NULL :P Chociaż w funkcji i tak ją alokuje gdy pGlowa nie wskazuje na nic.

komentarz 17 lipca 2020 przez j23 Mędrzec (194,920 p.)

Czy to jest jakaś różnica względem c++?

Jeśli chodzi o ręczne zarządzanie pamięcią, nie ma różnicy.

W C++ nie musisz implementować list, bo te są już w bibliotece standardowej.

Tam zawsze tak robiłem i chyba nigdy nie miałem wycieków z tego powodu.

No właśnie, chyba...

1
komentarz 17 lipca 2020 przez Oscar Nałogowiec (29,320 p.)

@kaminie318,
 to strcpy(malloc(strlen... robi to samo co funkcja strdup.

0 głosów
odpowiedź 17 lipca 2020 przez Oscar Nałogowiec (29,320 p.)
O ile dobrze domyśliłem się deklaracji to w wywołaniu rekurencyjnym (linia 23) wywołujesz funkcję z parametrem historiaGry* a powinno być historiaGry**.
komentarz 17 lipca 2020 przez kaminie318 Bywalec (2,070 p.)
Nie, dwie gwiazdki podkreśla edytor.

Podobne pytania

0 głosów
2 odpowiedzi 182 wizyt
pytanie zadane 13 sierpnia 2023 w C i C++ przez Janchess Początkujący (480 p.)
0 głosów
1 odpowiedź 75 wizyt
pytanie zadane 7 stycznia 2021 w C i C++ przez idkn Nowicjusz (120 p.)
+1 głos
1 odpowiedź 150 wizyt
pytanie zadane 5 czerwca 2020 w C i C++ przez kamylmeister Nowicjusz (190 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...