Skocz do zawartości

[c] Duży Problem Z Wyciekiem Pamięci


morsik

Rekomendowane odpowiedzi

Witam.

 

Oto kod (specjalnie na wklej.org, aby były numery lini i kolorowanie): http://wklej.org/id/38207/

 

Mam dość duży problem z wyciekiem pamięci w jack_meterze którego sam troche przerobiłem. Gdzie leży problem znalazłem, a są to linie 387, oraz 393 (te zawierające funkcję jack_port_get_connections).

 

Pamięc jest tam przydzielana, ale nie jest zwalniana, w efekcje czego program po 5 minutach potrafi zjeść nawet 3% RAM z mojego dostępnego 1GB. Tuż po uruchomieniu program zużywa 0.1% pamięci.

 

Moja znajomośc C/C++ zbyt duza nie jest, więc bedę wdzięczny jeśli ktoś podrzuci działający fragment kodu, który będzie usuwał wynik tej funkcji z pamięci.

 

Z góry dzięki.

Odnośnik do komentarza
Udostępnij na innych stronach

nie widze abyś obiekt który zwalniasz tworzył operatorem new, być może w tym jest problem. Możesz też sprobować zamiast free użyć delete, nie korzystałem nigdy z tych bibliotek, więc tylko sugeruję

 

p.s. C i C++ troszkę się róznią, zacząlem pisać o C++, w C spróbuj korzystać z operatora malloc

Odnośnik do komentarza
Udostępnij na innych stronach

Niestety, ale się nie udało, próbowałem tak:

malloc(client_status = jack_port_get_connections(input_port)[0]);

a potem:

free(connected_clients);

ale niestety program sie wyawla od razu.

Próbowałem także:

        char *ptr1;
// ... //
            ptr1 = malloc(client_status = jack_port_get_connections(input_port)[0]);
// ... //
        free(ptr1);

Jednak i to nie działa.

Odnośnik do komentarza
Udostępnij na innych stronach

zapomniałem wspomnieć że złe uzycie free, czyli dwa lub więcej razy też powoduje wycieki pamięci, z ciekawości poszukam jak to jest z tablicami wielowymairowymi w klasycznym C

 

a co do Twojego ostatniego kodu, to mallock powinien wyglądać tak malloc(rozmiar pamięci) bo w tym co podałeś to w mallocu przypisujesz po prostu jedną wartość

Odnośnik do komentarza
Udostępnij na innych stronach

Jak już wspomniałem programowania cały czas się uczę, a i raczej jestem nastawiony na C++, a to jest w C (taki było oryginał to tak zostawiłem).

 

Patrząc na man 3 free zauważyłem, że malloc jako argument bierze wielkość, ale właśnie nie wiedziałem jaką wielkość tam podać, więc próbowałem tą zmienną.

Odnośnik do komentarza
Udostępnij na innych stronach

w tym kodzie który podałeś:

malloc(client_status = jack_port_get_connections(input_port)[0]);

komputer mógł i pewnie zinterpretował to tak:

nowa wartość client_status to od teraz jack_port_get_connections(input_port)[0], operacja przebiegła bez zarzutu więc to jest wartość true i mógl tutaj (w nawiasie) byle co wstawić, nawet 1;) jeśli ta wartość jack_port_get... jest stała to zobacz jaką ma wielkość operatorem sizeof.

To takie małe uwagi, powodzenia dalej z programem :)

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli faktycznie przyczyną są linie o których napisałeś to problem jest w pliku w którym jest definicja funkcji jack_port_get_connections, nigdzie w podanym pliku nie ma alokacji za pomocą malloc. Jeżeli w tej funkcji jest dynamiczna alokacja to musisz podejrzeć jak jest wykonnana i usunąć to co powstało. Być może musisz zadziałać free na każdym z elementów, ale musisz wiedzieć ile ich jest - zapewne chodzi o tę liczbę zwracaną przez jack_port_connected(input_port)

To wszystko oczywiście to wróżenie z fusów bo trzeba poprostu zobaczyć na kod.

jeśli ta wartość jack_port_get... jest stała to zobacz jaką ma wielkość operatorem sizeof.

funkcja ta zwraca char**, sizeof na wskaźniku pokaże 4

 

ps.

const char** jack_port_get_connections ( const jack_port_t * port )

 

Returns:

a null-terminated array of full port names to which the port is connected. If none, returns NULL.

 

The caller is responsible for calling free(3) on any non-NULL returned value.

Czyli faktycznie należałoby zwolnić pamięć!

Odnośnik do komentarza
Udostępnij na innych stronach

To wszystko oczywiście to wróżenie z fusów bo trzeba poprostu zobaczyć na kod.

Kod czego? Przecież kod do mojego programu podałem, a do JACKa do raczej żaden problem też zobaczyć...

 

Czyli faktycznie należałoby zwolnić pamięć!
To to wiem i ja... ale jak i gdzie?
Odnośnik do komentarza
Udostępnij na innych stronach

Kod czego? Przecież kod do mojego programu podałem, a do JACKa do raczej żaden problem też zobaczyć...
Akurat kodu nie znalazłem, za to jest dokumentacja: http://jackaudio.org/files/docs/html/jack_8h.html z której w poprzednim poście wkleiłem cytat. (warto czytać!)

To to wiem i ja... ale jak i gdzie?

na pewno warto zwolnić pamięć przed wywołaniem funkcji w linii 393, sprawdzając wcześniej czy nie jest pusty wskaźnik. I ewentualnie po wyjściu z pętli przed zakończeniem programu.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...