User Tools

Site Tools


dydaktyka:cprog:2015:dynamic_memory_allocation

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
dydaktyka:cprog:2015:dynamic_memory_allocation [2015/11/15 22:33]
pkleczek [Zwalnianie pamięci – funkcja free]
— (current)
Line 1: Line 1:
-====== Dynamiczna alokacja pamięci ====== 
  
-W języku C można wyróżnić dwie podstawowe metody alokacji (przydzielania) pamięci: 
-  * **alokacja statyczna** -- ilość pamięci zostaje z góry określona na etapie pisania programu (poprzez odpowiednie deklaracje zmiennych); pamięć jest zwalniana automatycznie -- po zakończeniu bloku programu, w którym była deklarowana (chyba, że obiekt został zadeklarowany jako ''​static''​),​ lub po zakończeniu programu 
-    <code c> 
-    int a; 
-    char str[] = "​Hello!";​ 
-    float tab[5];</​code>​ 
-  * **alokacja dynamiczna** -- program przydziela dowolne ilości pamięci w trakcie pracy, poprzez wywołanie odpowiednich funkcji; pamięć musi być jawnie zwolniona (z użyciem odpowiedniej funkcji) 
-    <code c> 
-    int* tab = (int*) malloc(5 * sizeof(int));​ 
-    free(tab);</​code>​ 
- 
-Dynamiczna alokacja pamięci pozwala przede wszystkim na: 
-  * utworzenie tablicy o rozmiarze obliczanym dopiero podczas działania programu 
-  * dostęp do zmiennych utworzonych wewnątrz funkcji po wyjściu z nich 
- 
-===== Przydzielanie pamięci – funkcja "​malloc"​ ===== 
- 
-Funkcja [[http://​www.cplusplus.com/​reference/​cstdlib/​malloc/?​kw=malloc|malloc()]] (od //memory allocation//​) rezerwuje blok wolnej pamięci o zadanym rozmiarze (w bajtach) i zwraca adres jego pierwszego bajtu. W przypadku nieznalezienia wymaganego obszaru ''​malloc()''​ zwraca wskaźnik zerowy (dla przypomnienia -- wskaźnik o wartości ''​0''​). 
- 
-Ponieważ rezerwowany blok może być zmienną dowolnego typu, funkcja ta zwraca uniwersalny "​wskaźnik na ''​void''"​. Przypisanie takiego wskaźnika do wskaźnika dowolnego innego typu jest operacją dozwoloną przez standard języka. 
- 
-Aby utworzyć tablicę typu ''​double''​ o zadanym rozmiarze z użyciem funkcji ''​malloc()''​ można napisać następujący kod: 
-<code c> 
-int rozmiar = 10; 
-double* tab; 
-tab = malloc(rozmiar * sizeof(*tab));​ 
-</​code>​ 
- 
-Powyższy kod zarezerwuje obszar pamięci dla 10 wartości typu wskazywanego przez ''​tab''​ (czyli ''​double''​) i przypisze adres wskaźnikowi ''​tab''​. Zauważ, że zmienna ''​tab''​ została zadeklarowana jako wskaźnik do pojedynczej wartości ''​double'',​ a nie do bloku 10 takich wartości. Dlaczego? Ponieważ nazwa tablicy jest zarazem adresem jej pierwszego elementu, powyższe przypisanie umożliwia korzystanie z ''​tab''​ jak ze zwykłej nazwy tablicy (np. ''​tab[0]''​ to wartość jej pierwszego elementu). 
- 
-===== Zwalnianie pamięci – funkcja "​free"​ ===== 
- 
-Funkcja [[http://​www.cplusplus.com/​reference/​cstdlib/​free/?​kw=free|free()]] zwalnia pamięć przydzieloną przez ''​malloc()''​ (i tylko taką). Argumentem funkcji ''​free()''​ jest adres obszaru pamięci do zwolnienia. 
- 
-Na przykład: 
-<code c> 
-double* tab = malloc(8 * sizeof(double));​ 
-free(tab); 
-</​code>​ 
- 
-:!: System operacyjny wyznacz limit pamięci, jaki może wykorzystać dany program -- jego przekroczenie powoduje "​ubicie"​ programu. Zapominając zwolnić przydzieloną pamięć można łatwo doprowadzić do //​[[https://​pl.wikipedia.org/​wiki/​Wyciek_pami%C4%99ci|wycieku pamięci]]//​ i w konsekwencji właśnie do przedwczesnego zakończenia programu... 
- 
-===== Zmiana rozmiaru bloku pamięci – funkcja "​realloc"​ ===== 
- 
-Funkcja [[http://​www.cplusplus.com/​reference/​cstdlib/​realloc/​|realloc()]] służy do zmiany rozmiaru zaalokowanego dynamicznie bloku pamięci. Jej pierwszym argumentem jest adres bloku pamięci, a drugim -- nowy rozmiar (w bajtach). 
- 
-Do zwalniania pamięci przydzielonej przez ''​realloc()''​ służy również funkcja ''​free()''​. 
- 
-Przykład: 
-<code c> 
-double* tab; 
-int rozmiar_1 = 10; 
-int rozmiar_2 = 20; 
- 
-tab = malloc(rozmiar_1 * sizeof(*tab));​ 
-tab = realloc(tab,​ rozmiar_2 * sizeof(*tab));​ 
-free(tab); 
-</​code>​ 
dydaktyka/cprog/2015/dynamic_memory_allocation.1447623195.txt.gz · Last modified: 2020/03/25 11:46 (external edit)