Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] Problem z wyciekami pamieci

22 Maj 2020 09:44 480 10
  • Poziom 3  
    Witam, pisząc projekt napotkałem wycieki pamięci które nie bardzo moge zniwelowac, w czym może leżeć problem tutaj? Z góry dziekuje za pomoc.



    Kod: c
    Zaloguj się, aby zobaczyć kod
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Poziom 3  
    Zwalniam ta pamiec w funkcji clearlist, przynajmniej tak mi sie wydaje
  • Poziom 21  
    RainbowDusk napisał:
    Zwalniam ta pamiec w funkcji clearlist, przynajmniej tak mi sie wydaje

    Zapewne tak jest . Niedawno zaczalem zaglebiac sie we wskazniki i jako tako lapie. Jednak wskaznikow do wskaznikow nie przerabialem i troche gubie sie w tym kodzie.
  • Poziom 3  
    Ale i tak dziekuje za probe pomocy
  • Pomocny post
    Poziom 34  
    strdup też alokuje pamięć i trzeba ją później zwolnić przez free.
  • Poziom 3  
    strdup alokuje mi pamiec na nowego stringa, probowalem przypisac tego nowego stringa i zwolnic z niego pamiec, ale nie zabardzo to przechodzi, w jaki sposob odbywa sie zwolnienei pamieci na strdup?

    Dodano po 35 [minuty]:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    czy cos takiego mialoby sens?
  • Poziom 23  
    Nie ufałbym VLD - lista fałszywych pozytywów bywa długa. Borlandowy CodeGuard jest nieporównywalnie lepszy moim zdaniem, lepszy nawet niż komercyjne narzędzia dla Visuala które testowałem, Purify, DevPartner.
    VLD według opisu powinien pokazać gdzie jest wyciek, aczkolwiek u mnie częściej nie działał niż działał albo wszystko ginęło w fałszywych pozytywach.
  • Poziom 3  
    Kod: c
    Zaloguj się, aby zobaczyć kod



    zalatwilo sprawe..
  • Poziom 37  
    RainbowDusk napisał:
    strdup alokuje mi pamiec na nowego stringa, probowalem przypisac tego nowego stringa i zwolnic z niego pamiec, ale nie zabardzo to przechodzi, w jaki sposob odbywa sie zwolnienei pamieci na strdup?

    Dodano po 35 [minuty]:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    czy cos takiego mialoby sens?


    Ten kod jest bez sensu. Funkcję strdup się używa, aby tymczasowy, posiadany w danej chwili string utrwalić.
    Tutaj sam nie wiesz, co chcesz (to podwójne podstawienie i zwolnienie), pole songName będzie zawierało adres do już nieważnego bloku pamięci, po dłuższym czasie tam będą robale.. Za wczesne zwolnienie jest odwrotnym błędem do nie-zwolnienia, a chyba nawet cięższym w skutkach.

    Śledzę ten wątek długo. Podwójne gwiazdki, te klimaty. To nie jest kod, nad jakim jest zagwarantowane pełne panowanie.
    Wszystkie te męki są rozwiązane w C++, czy przez std::string, referencje zamiast (niektórych) wskaźników, klasy zamykające funkcjonalności, destruktory czy w ostateczności smart pointers.
    Cały ten projekt byłby bajecznie czytelny i bezpieczny w C++.
  • Poziom 3  
    W C++ nie mogłem tego pisać, mielismy pisać to w C, domyslam się że w innym języku by poszło to łatwiej, ale aktualnie z powodu że mielismy pisać w C to odrazu chce zrozumieć jak to wygląda a nie machnąc to by było okej.

    Dodano po 7 [minuty]:

    [quote="JacekCz"]
    RainbowDusk napisał:
    strdup alokuje mi pamiec na nowego stringa, probowalem przypisac tego nowego stringa i zwolnic z niego pamiec, ale nie zabardzo to przechodzi, w jaki sposob odbywa sie zwolnienei pamieci na strdup?

    Dodano po 35 [minuty]:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    czy cos takiego mialoby sens?

    Funkcja ta nie miala sensu zgadza sie, rzucilem tutaj dosc glupi pomysl z mysla jakby mial sens :D