Skocz do zawartości
dejmieno

Czy ta funkcja spowoduje wyciek pamieci? Substring.

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;
}

 

Udostępnij ten post


Link to post
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 😉

Udostępnij ten post


Link to post
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)?

 

Udostępnij ten post


Link to post
Share on other sites

free(subarray) przede wszystkim. pamięć się oczywiście sama magicznie nie zwolni. poczytaj o funkcjach realloc i alloca.

Udostępnij ten post


Link to post
Share on other sites
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++]

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

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

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »

×