Upravljanje memorijom

Izvor: Hrvatska internetska enciklopedija
Inačica 44238 od 21. kolovoza 2021. u 02:19 koju je unio WikiSysop (razgovor | doprinosi) (Bot: Automatski unos stranica)
(razl) ←Starija inačica | vidi trenutačnu inačicu (razl) | Novija inačica→ (razl)
Skoči na:orijentacija, traži

Upravljanje memorijom (engl. memory management) u programskom inženjerstvu je upravljanje memorijom računala rezervacijom dijelova memorije za podatke, i oslobađanjem iste od viška podataka. Točnije, ono se kod programskih jezika odnosi na stvaranje i uništavanje varijabli i objekata koji više nisu potrebni. Kod nekih se jezika ovo čini ručno, a neki jezici sami implementiraju ovu mogućnost, ili ju dobivaju uključivanjem vanjskih biblioteka. U druga dva slučaja, sakupljanje smeća se odvija automatski.

Ručno upravljanje memorijom

Kod ručnog upravljanja memorijom programer odlučuje koji će objekt (ili varijabla) biti uništen i kada, ovisno o tome da li ga se namjerava još koristiti dalje u kodu. Naravno, kod ručnog sakupljanja smeća postoji i ljudski faktor, zbog kojeg se može dogoditi da programer zabunom uništi varijablu/objekt koji je kasnije ipak kanio koristiti u programu, što može dovesti do greške u izvođenju programa (uslijed pokušaja korištenja nealociranog memorijskog prostora).

Primjeri

Klasičan primjer ručnosakupljanja smeća je funkcija free u programskom jeziku C, koja se najčešće koristi u sprezi sa funkcijom za dinamičko alociranje memorije malloc. Ekvivalent ovim funkcijama u programskom jeziku C++ su operatori delete i new. Slijede primjeri oslobađanja memorije u tim jezicima.

Sakupljanja smeća (varijabla) u jeziku C:

int *p_var = NULL; // deklaracija novog pokazivača (još ne pokaziuje ni na što - NULL) p_var = malloc(sizeof(int));// dinamičko alociranje memorije veličine brojčanog tipa integer /* ....... kod koji koristi gore stvorenu varijablu (preko pokazivača p_var) ........*/ free (p_var); // oslobađanje memorije p_var = NULL; // dereferenciranje pokazivača
Sakupljanje smeća (polje) u jeziku C++:
int size = 10;         // broj elemenata budućeg polja
int *p_var = NULL;
p_var = new int [size];//veličina = broj elemenata(size) * veličina tipa(int)

/* .......
kod koji koristi gore stvoreno polje
........*/

delete [] p_var;       // oslobađanje memorije
p_var = NULL;

Ručno oslobađanje memorije češće se koristi kod objekata, kao što su instance struktura i klasa koje one najčešće zauzimaju više mjesta, ili ih ima više nego pojedinih varijabli odnosno elemenata polja.

Sakupljanje smeća

Alternativan je način upravljanja memorijom ono automatsko, koje se naziva sakupljanjem smeća, kod kojeg se posao oslobađanja memorije suvišnih podataka prepušta samom prevoditelju. Ovaj to obavlja samostalno, primjenjujući algoritme čija je svrha odrediti (predvidjeti) koji objekti nakon kojeg mjesta u kodu više neće biti potrebni kad se program bude izvršavao. Na tim mjestima tada oslobađa memoriju od viška podataka (rečenih objekata). Primjer ovakvog pristupa je programski jezik Java koji ima ugrađeno sakupljanje smeća. Za neke jezike, npr. C i C++, postoje vanjske (third party) biblioteke koje imaju zadaću automatskog sakupljanja smeća.

Vidi