Dinamička dodjela memorije u C++

Dinamicka Dodjela Memorije U C



Obično, tijekom korištenja izvornih kodova u C++ programskom jeziku, prevodilac ručno dodjeljuje memoriju varijabli za pohranu podataka. Kaže se da je to dodjela statičke memorije. Ovo je fiksna memorija koja se ne može promijeniti nakon deklaracije. Za ovu vrstu dodjele memorije operativni sustav koristi stog za pohranu podataka. U statičkoj dodjeli, memorija se dodjeljuje prije nego što se izvorni kod počne izvršavati.

Dok se kod dinamičke dodjele memorije memorija dodjeljuje dok je izvođenje počelo. Ovu memoriju programer ručno dodjeljuje za vrijeme izvođenja, što je također poznato kao dodjela memorije za vrijeme izvođenja u C++. Veličina dinamičke memorije može se promijeniti na bilo kojem mjestu u programu jer u trenutku deklaracije ne spominjemo veličinu koja se može popraviti. Vrijednost dajemo samo izravno varijabli.

Razlika u dodjeli memorije normalnim varijablama

U normalnim varijablama, memorija koju dodjeljuje kompilator automatski se dodjeljuje i oslobađa. Kada programer dinamički dodjeljuje memoriju, on tada mora ukloniti ili osloboditi memoriju kada više nije od koristi u daljnjem izvođenju izvornog koda. Ova situacija uzrokuje 'curenje memorije' kada se program prekine dok memorija nije oslobođena.







Operatori za dinamičku alokaciju

U C++-u, dva operatora pomažu u dodjeljivanju i oslobađanju memorije: 'new' i 'delete' koji se koriste za dodjeljivanje i oslobađanje memorije na bolji način.



Novi operater

Označava zahtjev za dodjelom memorije. Novi operator inicijalizira memoriju i vraća adresu te dodijeljene memorije varijabli pokazivača ako ima dovoljno dostupne memorije.



Objekt pokazivača = novi podaci - tip ;

Brisanje operatora

Kao i new operator, delete operator se koristi za uklanjanje dodijeljene memorije. U C++-u, programer može koristiti ovaj operator za dealokaciju.





# Brisanje pointer_variable;

Primjer 1

U ovom primjeru uvest ćemo dva pokazivača: jedan je pokazivač tipa integer, a drugi je pokazivač float. Pokazivači se inicijaliziraju korištenjem znaka zvjezdice uz njih.

# Int * pointInt;
# Float *pointfloat;

Korištenjem ova dva pisača dinamički ćemo alocirati memoriju.



Uloga pokazivača u dinamičkoj dodjeli:
Memorija skladišnog prostora razvija se u obliku blokova. Kad god izvršavamo program ili izvodimo bilo koju operaciju, memorija se dodjeljuje za tu specifičnu svrhu. Ta memorija ima posebnu adresu koja je povezana s programom koji identificira kojem procesu ili programu je dopuštena ta memorija. Svakom memorijskom utoru se pristupa preko adrese kojoj pripada. Dakle, ova adresa je pohranjena kroz pokazivače. Ukratko, potrebni su nam pokazivači za pristup memoriji i na isti način za dodjelu određenog dijela memorije bilo kojem zadatku. Pokazivači su potrebni za pohranjivanje adresa.

Budući da se ključna riječ 'new' koristi za dinamičku dodjelu memorije u ručnoj dodjeli, memoriju dodjeljuje prevoditelj. Ne trebamo dodijeliti memoriju tijekom izvođenja. Ali kako je dinamička dodjela nasumična, moramo identificirati pokazivače i za proces vezanja koristi se ovaj novi operator.

# Pointint = novo int;

Slično, plutajući pokazivač je vezan na isti način. Nakon procesa vezanja, dodijelit ćemo bilo koju vrijednost memoriji koju želimo rezervirati za bilo koju operaciju. Deklaracijom pokazivača memoriji pridjeljujemo određenu vrijednost.

# *pointInt = 50;

Također je deklarirana vrijednost float za točke float. Prikaz vrijednosti nakon dodjele.

Kao što smo spomenuli, operator 'new' koristi se za dodjelu, dok se 'delete' koristi za oslobađanje memorije. Dakle, nakon što dovršite zadatak ili operaciju u kodu, mi ćemo ukloniti memoriju koju smo dodijelili zadatku.

Bolje je osloboditi taj dio memorije kako bi bilo koji drugi proces mogao ovo iskoristiti. Primijenit ćemo ovu dodjelu na oba pokazivača.

Izbriši točku plutati ;

Nakon što spremite kod u uređivač teksta, Ubuntu terminal vam omogućuje da izvršite izvorni kod unutar datoteke kroz g++ kompajler.

$ g++ -o mem mem.c
$ ./mem

Nakon izvršenja, vidjet ćete vrijednosti dodijeljene memoriji.

Primjer 2

Ovaj primjer uključuje interakciju korisnika. Uzet ćemo brojčanu varijablu koja će sadržavati vrijednost od korisnika. Ovaj program će pohraniti rezultat u GPA učenika. Svi rezultati bit će spremljeni tijekom izvođenja.

Kada korisnik unese broj učenika, svakom broju se dodjeljuje memorija. Ovdje se inicijalizira pokazivač tipa float koji će se koristiti u dodjeli memorije rezultata.

Uzimamo pokazivač u float jer je GPA u decimalnom zapisu. Uzimamo polje tipa pokazivača za GPA budući da može rezultirati velikom broju učenika.

Ptr = novi plutati [ na jedan ]

Ovaj niz pokazivača s ključnom riječi 'new' povezat će izvođenje s memorijom. Prosječni uspjeh bit će upisan za svakog učenika. Kako nismo upoznati s brojem učenika koje korisnik želi dodati, koristili smo for petlju za unos GPA do unesenog broja. U svakom ponavljanju petlje, od korisnika se traži da unese rezultat koji identificira učenika. Nakon što se rezultat spremi, ponovno ćemo koristiti petlju za prikaz svih prosječnih ocjena učenika. Na kraju, niz pokazivača se briše, jer je svrha dinamičke pohrane postignuta.

Izbrisati [ ] ptr ;

Sada ćemo izvršiti gore spomenuti kod. Od korisnika će se prvo tražiti da unese broj učenika. Zatim će se unijeti GPA za svakog učenika.

Primjer 3

Ovaj primjer koristi operatore new i delete za objekt klase. Ova klasa sadrži privatnu varijablu cjelobrojnog tipa koja pohranjuje dob. U javnom dijelu klase kreira se konstruktor koji će dob inicijalizirati na brojku 10. Ovdje se koristi druga funkcija koja će prikazati dob koja je inicijalizirana u konstruktoru.

Sada ćemo ići prema glavnom programu za dinamičku dodjelu. Objekt klase se stvara dinamički.

Student * ptr = novi student ( ) ;

Kada se objekt formira, konstruktor će se automatski implementirati. Učinit će se poziv funkcije za dobivanje dobi. To će se učiniti putem ptr.

Ptr - > getAge ( ) ;

I na kraju će se osloboditi sjećanja.

Zaključak

Dinamička dodjela memorije programer dodjeljuje tijekom izvođenja umjesto fiksne memorije koju identificira kompajler. Ova dodjela je nasumična i može se eliminirati nakon što se iskoristi. Dok, u većini slučajeva, prije uklanjanja, proces izvršenja se zaustavlja i ta dinamička dodjela zatim uzrokuje curenje memorije. Implementirali smo ovaj fenomen u različitim pristupima u Ubuntu Linux sustavu koristeći C++ programski jezik.