Alocarea memoriei se poate aloca static sau dinamic, in timpul executiei.
Pentru a utiliza eficient zona de memorie, aceasta trebuie dealocata ori de cate ori nu mai este nevoie de acea zona de memorie.
Dealocarea memoriei reprezinta eliberarea zonei de memorie care a fost alocata dinamic, acolo unde alocarea se realizeaza in heap.
Functiile care se ocupa cu alocarea memoriei in Linux sunt: malloc(), calloc(), realoc(). Dealocarea memoriei in Linux se realizeaza cu ajutorul functiei free().
Functiile de alocare si dealocare a memoriei mentionate mai sus sunt apeluri de biblioteca si rezolva cererile de alocare si dealocare de memorie in user space.
Implementare:
Implementarea functiei malloc se poate face in functie de sistemul de operare. Unele implementari contin niste tabele cu informatii specificand zonele de memorie alocate in heap. La un apel malloc care cere are o zona de memorie libera din heap alocarea se va realiza imediat, marcand in tabel zona respectiva ca fiind alocata.
Unele implementari adauga un header care contin informatii utile: dimensiune zonei de memorie, pointerul catre urmatoarea zona de memorie, starea acelei zone(daca este libera sau nu).
Sursa: http://elf.cs.pub.ro/so/wiki/laboratoare/laborator-04
#include
void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
Descriere:
Functia malloc() aloca o zona de memorie de dimensiune ceruta si returneaza un pointer catre memoria care a fost alocata. Memoria nu este initializata. Daca “size” din exemplul de mai sus este 0, atunci functia malloc() returneaza fie NULL, fie un pointer unic care poate fi ulterior dealocat cu functia free().
Linux foloseste in mod default urmatoarea startegie de alocare a memoriei: atunci cand functia malloc returneaza o valoare nenula nu se stie daca aceasta zona de memorie este cu adevarat disponibila(libera). In cazul in care sistemul nu mai are memorie disponibila unul dintre procese va fi oprit, astfel eliberandu-se o zona din memorie.
In mod normal functia malloc aloca memorie in heap si ajusteaza dimensiunea memoriei heap folosind functia sbrk(2);
Pentru a evita problemele aparute in cazul aplicatiilor multithreading sunt folosite anumit obiecte(mutual exclusion objects - mutexes) pentru a permite firelor de executie sa imparta aceleasi resurse, dar nu simultan. Aceste obiecte (mutexes) au nume unice si sunt create cand un program este pronit.
Functia calloc aloca o zona de memorie in heap(exemplu: void *calloc(size_t nmemb, size_t size), functia primeste doua argumente “nmemb” ce reprezinta numarul de elemente si “size” ce reprezinta dimensiunea fiecaruri element) si returneaza un pointer catre memoria alocata. Aceasta zona de memorie este initializata cu valoarea null.
Functia realloc redimensioneaza o zona de memorie ce a fost alocata cu functiile malloc, calloc sau realloc. In caz ca noua dimensiune este mai mare decat dimensiunea precedenta, atunci memoria nou adaugata nu va fi initializata.
Functia free elibereaza o zona de memorie alocata cu una dintre functiile precizate mai sus . Aceasta functie nu returneaza nicio valoare.
Exemple de alocare a memorie folosind functia malloc :
Sursa: http://elf.cs.pub.ro/so/wiki/laboratoare/laborator-04
In primul exemplu de folosire a functiei malloc se preia mai intai ‘n’, numarul de elemente al vectorului care trebuie alocat, folosind parametrii din linia de comanda cu care a fost rulat programul.
Se declara apoi un pointer catre un sir de caractere, pentru care este alocat spatiu cu ajutorul functiei ‘malloc’. Functia ‘malloc’ primeste ca parametru dimensiunea (in octeti) a spatiului ce trebuie alocat. Pentru a obtine aceasta dimensiune se inmultesc numarul de elemente si dimensiunea fiecarui element. Numarul de elemente este “n+1”, asigurand astfel spatiu si pentru caracterul ‘\0’ care incheie sirul de caractere.
In cazul in care rezultatul operatiei de alocare este ‘null’, ceea ce semnaleaza esuarea acesteia, se semnaleaza problema cu ajutorul functiei perror (care afiseaza un mesaj specific la stderr), dupa care se incheie programul.
In cazul executiei cu succes, zona de memorie este eliberata (functia ‘free’) la finalul executiei, iar pointer-ul la sirul de caractere modificat (setat ‘null’), incat sa nu referentieze o zona de memorie nealocata.
A doua parte a exemplului de mai sus foloseste deasemenea argumentele primite de program, iar de aceasta data creeaza un vector de pointeri catre acele argumente. Pentru a realiza acest lucru se declara o variabila de tip char** (un vector de siruri de caractere), alocat tot cu ajutorul functiei ‘malloc’. De aceasta data fiecare element al vectorului care trebuie alocat este de tip char*, iar numarul de elemente este argc-1 (numarul de argumente primite de program din linia de comanda, exceptandu-l pe primul, care intotdeauna este numele programului). Se semnaleaza eroarea si se incheie programul in cazul unei probleme (daca rezultatul functiei malloc a fost ‘null’), iar in caz de succes se copiaza in vectorul alocat valorile pointerilor catre argumentele primite de program (se copiaza unul cate unul folosind un for).
Din nou, la sfarsitul executiei se elibereaza zona de memorie alocata, iar pointer-ul este setat ‘null’ incat sa nu referentieze o zona nealocata.
Exemplu de alocare a memorie folosind functia calloc :
Sursa: http://elf.cs.pub.ro/so/wiki/laboratoare/laborator-04
In acest exemplu se incearca o alocare in heap prin intermediul functiei calloc. Se apeleaza functia calloc care primeste ca parametrii n, ce reprezinta numarul de elemente si sizeof(list_t), ce reprezinta dimensiunea elementului. In cazul in care elementul list_v este null, atunci va aparea o eroare si se va iesi din acest program. In cazul in care alocarea s-a realizat cu succes, deci nu au aparut erori la alocare, programul continua cu o eliberare de memorie a zonei alocate cu functia calloc.
Exemplu de alocare a memoriei folosind functia realloc :
Sursa: http://elf.cs.pub.ro/so/wiki/laboratoare/laborator-04
In exemplu de mai sus se apeleaza pentru alocarea memoriei in heap functia malloc, iar apoi se apeleaza functia realloc pentru a redimensiona zona de memorie alocata anterior cu functia malloc.
Parametrul functiei realloc ‚’(n+extra)*sizeof(int)’, indica noua dimensiune a memoriei care va fi alocata. In cazul in care noua dimensiune este mai mare decat dimensiunea precedenta, atunci memoria nou adaugata nu va fi initializata.
Programul de incheie cu eliberarea memoriei ce se realizeaza prin intermediul functiei free, iar pointer-ul este setat ‘null’ incat sa nu referentieze o zona nealocata.
Exemplu de dealocare a memoriei folosind functia free:
int nr_elemente = atoai(argv[1]);
char *sir;
sir = malloc((n+1)*sizeof(char));
if(NULL == sir){
perror(”malloc”);
exit(EXIT_FAILURE);
}
free(sir);
free=’’NULL’’;
p://linux.about.co Sursa: htt m/library/cmd/blcmdl3_scandir.htm
Exemplu acesta este asemanator exemplului de mai sus, de la functia malloc. Functia va prelua numarul de elemente al vectorului care trebuie alocat, folosind parametrii din linia de comanda. In cazul in care rezultatul operatiei de alocare este ‘null’, ceea ce semnaleaza esuarea acesteia, se semnaleaza problema cu ajutorul functiei perror (care afiseaza un mesaj specific la stderr), dupa care se incheie programul.
In cazul executiei cu succes, zona de memorie este eliberata (functia ‘free’) la finalul executiei, iar pointer-ul la sirul de caractere modificat (setat ‘null’), incat sa nu referentieze o zona de memorie nealocata.
Dostları ilə paylaş: |