Skocz do zawartości

Czy ta funkcja spowoduje wyciek pamieci? Substring.


dejmieno

Pomocna odpowiedź

Witam,

Chcialem sie was zapytac, czy ta funkcja jest poprawna? Czy takie rozwiazanie nie bedzie powodowac wyciekow pamieci? Czy rozmiar tablicy jest dobrze alokowany?

char * subarray;
char buffor[30];
uint8_t bufforElementsNumber = 0;

char * getSubArray(int size, char array[]) {
	subarray = NULL;
	subarray = malloc(sizeof(char) * size);
	for (int i = 0; i < size; i++) {
		subarray[i] = array[i];
	}
	return subarray;
}

 

Link do komentarza
Share on other sites

Jeśli pytasz o poprawność funkcji to przydałaby się komentarze lub słowny opis tego, co według Ciebie (i jak) robi dany fragment kodu. Inaczej może się okazać, że ktoś potwierdzi poprawność kodu, a całość będzie działała inaczej niż myślisz 😉

Link do komentarza
Share on other sites

Ta funkcja przyjmuje tablice ( w praktyce jest to tablica buffor ) i tworzy podtablice o danym rozmiarze. Tylko teraz nie wiem czy taka praktyka nie spowoduje wycieku pamieci? Teraz sobie mysle ze jednak NULL jest nie wystarczajacy bo przeciez tylko nullujemy wskaznik ale zalokowany blok pamieci pozostaje prawda?

getSubArray jest wykonywany w petli i zastanawiam sie czy przy ktoryms cyklu nie wylecie OutOfMemory.

Zastanawiam sie czy przed kazdym wywolaniem getSubArray nie powinienem wywolac free(&subarray)?

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

39 minut temu, dejmieno napisał:

Tylko teraz nie wiem czy taka praktyka nie spowoduje wycieku pamieci?

Tak, może [i pewnie tak będzie] spowodować.

Jeżeli jest malloc(), to powinien być free, gdy już nie potrzebujesz. Chyba, że masz to w niewidocznej części programu. A takie, głupie pytanie, w czym programujesz? 😉

47 minut temu, dejmieno napisał:

Zastanawiam sie czy przed kazdym wywolaniem getSubArray nie powinienem wywolac free(&subarray)?

Nie, a szczególnie przed pierwszym - wtedy jeszcze subarray == Null i nie jestem pewny, czy C nie wywali się [niestety przeszedłem na C++]

Link do komentarza
Share on other sites

(edytowany)
18 godzin temu, narbej napisał:

A takie, głupie pytanie, w czym programujesz? 😉

Na codzien programuje w jezykach wysokiego poziomu Java & Kotlin, wiec pewne elementy z C ktore normalnie zalatwia Garbage Collector musze ogarnac. Ale w sumie mozna bardzo wiele sie nauczyc.

Ok, wykorzystalem funkcje free, tylko teraz pytanie czy powinienem przekazac tablice czy & referencje do tablicy? Czy tablica domyslnie nie jest przekazywana jako referencja?

Rozumiem ze po wywolaniu free to normalne ze we wskazniku wskazniku sa jakies dane poniewaz tylko zwolnilem pamiec a wskaznik nadal wskazuje na jakis blok pamieci tylko ze pusty? Dobrze rozumiem? 

Edytowano przez dejmieno
  • Lubię! 1
Link do komentarza
Share on other sites

To jest z tego co widzę C a nie C++, więc nie istnieje pojęcie referencji a jedynie wskaźnik. W związku z tym dość trudno cos przekazać przez referencję...

Wskaźnik w przeciwieństwie do referencji może wskazywać na cokolwiek, Twoim zadaniem jest przypilnowanie aby w przypadku kiedy wskazuje na zwolniony blok pamięci więcej go nie używać.

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.