Upravljanje memorijom
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.
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 (zbog pokušaja korištenja nealociranog memorijskog prostora).
Klasičan primjer ručnosakupljanja smeća je funkcija free u programskom jeziku C, koja se najčešće koristi u sprezi s 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:
|
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.
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.