Kako raditi s dinamičkom dodjelom memorije C ++?

Ovaj članak istražuje dinamičku dodjelu memorije u C ++-u, važnu značajku koja vam omogućuje da uzmete u obzir potrebe vaše memorije za resursima u stvarnom vremenu.

Dinamička dodjela memorije U C ++-u je vrlo važna značajka koja vam omogućuje da razmotrite svoje zahtjeve kako biste se riješili potrebe za resursima u stvarnom vremenu. U ovom bismo članku istraživali Detaljno istraživanje. Slijedeće upute bit će obrađene u ovom članku,

Pa krenimo s ovim člankom o Dinamičkoj dodjeli memorije u C ++



Potrebna vam je dinamička dodjela memorije?

Recimo, želimo unijeti rečenicu kao niz znakova, ali nismo sigurni u točan broj znakova potreban u polju.

Sada, dok deklariramo niz znakova, ako odredimo njegovu veličinu manju od veličine željenog niza, dobit ćemo pogrešku jer je prostor u memoriji dodijeljen nizu manji u odnosu na veličinu ulaznog niza. Ako odredimo njegovu veličinu veću od veličine ulaznog niza, tada će se nizu dodijeliti prostor u memoriji koji je puno veći od veličine željenog niza, čime nepotrebno troši više memorije čak i kada nije potrebna.

U gore navedenom slučaju nemamo pojma o točnoj veličini niza sve do vremena kompajliranja (kada računalo kompajlira kôd i niz unese korisnik). U takvim slučajevima koristimo novi operater.

C ++ definira dva unarna operatora novi i izbrisati koji izvršavaju zadatak dodjeljivanja i oslobađanja memorije tijekom izvođenja. Budući da ovi operatori (novi i izbrisani) djeluju na slobodnoj memoriji memorije (Heap memory), oni se nazivaju i operatorima slobodne trgovine. Pokazivači pružaju potrebnu podršku za sustav dinamičke dodjele memorije u C ++.

Uz pomoć Dynamic Allocation, program može dobiti memoriju tijekom izvođenja.

Globalne i lokalne varijable dodjeljuju se memoriji tijekom vremena kompajliranja. Međutim, ne možemo dodati nikakve globalne ili lokalne varijable tijekom izvođenja. Ako program treba koristiti promjenjivu količinu memorije, trebali bismo dodijeliti memoriju tijekom izvođenja, prema potrebi i kada je to potrebno. I naravno, ovdje rutinske dinamičke dodjele mogu poslužiti svrsi.

Razlike između statičke dodjele memorije i dinamičke dodjele memorije:

razvrstaj popis c ++

Ovo je osnovna memorijska arhitektura koja se koristi za bilo koji program C ++:

Memorija - Dinamičko dodjeljivanje memorije - Edureka

Trebat će nam ovakva slika

Stog se koristi za statičku dodjelu memorije, a hrpa za dinamičku dodjelu memorije, obje su spremljene u RAM-u računala.

Varijable koje se raspoređuju u stogu dok se dodjeljivanje statičke memorije pohranjuje izravno u memoriju i pristup toj memoriji je vrlo brz, a s njezinom se dodjelom rješava kada se program kompajlira. Kada funkcija ili metoda pozove drugu funkciju koja bi zauzvrat mogla pozvati drugu funkciju i tako dalje, izvršavanje svih tih funkcija ostaje obustavljeno sve dok zadnja funkcija ne vrati svoju vrijednost. Stog se uvijek pohranjuje u LIFO (zadnji u prvom izlazu) redoslijedom, a posljednji rezervirani blok je uvijek sljedeći blok koji se oslobađa. To pomaže u praćenju stoga, jer oslobađanje bloka iz stoga nije ništa drugo nego prilagođavanje jednog pokazivača.

Varijablama dodijeljenim na hrpi memorija se dodjeljuje u vrijeme izvođenja tijekom dinamičke dodjele memorije. Pristup ovoj memoriji je nešto sporiji u usporedbi sa stogom, ali veličina hrpe ograničena je samo veličinom virtualne memorije. Element hrpe međusobno ne ovisi i uvijek mu se može pristupiti slučajno u bilo kojem trenutku. Blok možemo dodijeliti u bilo kojem trenutku i osloboditi ga u bilo kojem trenutku. To otežava praćenje dijelova hrpe koji su u bilo kojem trenutku dodijeljeni ili oslobođeni.

Nastavljamo s ovim člankom o Dinamičkoj dodjeli memorije na C ++

Dodjela memorije pomoću novi Ključna riječ

U C ++-u novi Operator se koristi za dodjelu memorije tijekom izvođenja, a memorija se dodjeljuje u bajtovima. The novi operator označava zahtjev za dinamičkom dodjelom memorije na hrpi. Ako je dostupno dovoljno memorije, tada se novi operator inicijalizira memoriju i vraća adresu novo dodijeljene i inicijalizirane memorije na varijablu pokazivača.

Sintaksa:

tip podataka * pointer_name = novi tip podataka

Primjer:

int * ptr = new int // Varijablu možemo dinamički dodijeliti na sljedeća dva načina. int * ptr = new int (10) int * ptr = new int {15} // novi operator se također koristi za dodjelu bloka (niza) memorije tipa data-type. int * ptr = new int [20] // Gornja izjava dinamički dodjeljuje memoriju za 20 cijelih brojeva neprekidno tipa int i vraća pokazivač na prvi element sekvence na pokazivač 'ptr'.

Bilješka : Ako hrpa nema dovoljno memorije za dodjelu, novi zahtjev ukazuje na neuspjeh izbacivanjem iznimke std :: bad_alloc, osim ako se s novim operatorom ne koristi “nothrow”, u tom slučaju vraća NULL pokazivač. Stoga je dobra praksa provjeriti postoji li varijabla pokazivača koju proizvodi new prije nego što je upotrijebite u programu.

Nastavljamo s ovim člankom o Dinamičkoj dodjeli memorije na C ++

Dodjela memorije pomoću izbrisati Ključna riječ:

Jednom kada se hrpa memorije dodijeli varijabli ili objektu klase pomoću novi ključnu riječ možemo osloboditi taj memorijski prostor pomoću izbrisati ključna riječ.

Sintaksa:

fibonaccijev broj c ++
delete pointer_variable // Ovdje je pointer_variable pokazivač koji pokazuje na objekt podataka stvoren od new. delete [] pointer_variable // Za oslobađanje dinamički dodijeljene memorije niza na koju ukazuje pointer-variable koristimo sljedeći oblik delete:

Primjer:

delete ptr delete [] ptr

Bilješka : Opseg ili životni vijek objekta vrijeme je za koje objekt ostaje u memoriji tijekom izvršavanja programa. Dodjela memorije hrpe sporija je od stoga, jer u hrpi ne postoji određeni redoslijed kojim možete dodijeliti memoriju, dok u stogu slijedi LIFO.

Nastavljamo s ovim člankom o Dinamičkoj dodjeli memorije na C ++

Dinamičko dodjeljivanje nizova

Glavna upotreba koncepta dinamičke dodjele memorije je za dodjelu memorije nizu kada je moramo deklarirati određivanjem njene veličine, ali nismo sigurni u nju.

Pogledajmo primjer za razumijevanje njegove upotrebe.

#include using space names std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * marks = new int [len] // Dinamička dodjela memorije cout<< 'Enter the marks of each student' << endl for( int i = 0 i>* (oznake + i)} za (int i = 0 i

Obrazloženje:
U ovom primjeru prvo tražimo od korisnika broj učenika u razredu i njegovu vrijednost pohranjujemo u varijablu len. Zatim deklariramo niz cijelih brojeva i dodijeljujemo mu prostor u memoriji dinamički jednak vrijednosti pohranjenoj u varijabli len pomoću ove izjave int * marks = new int [length] pa mu se dodjeljuje prostor jednak 'length * (veličina 1 cijeli broj) '. Ostatak koda je samorazumljiv.

Nastavljamo s ovim člankom o Dinamičkoj dodjeli memorije na C ++

Dinamičko dodjeljivanje memorije za objekte

Također možemo dinamički dodijeliti objekte.

Kao što znamo da je Constructor posebna funkcija člana klase koja se koristi za inicijalizaciju objekta, a Destructor je također funkcija člana klase koja se poziva kad god objekt izlazi iz opsega.

Destruktor se može koristiti za oslobađanje memorije dodijeljene objektu. Poziva se u sljedećim uvjetima.

  • Kada lokalni objekt izađe iz opsega
  • Za globalni objekt, kada se operator primijeni na pokazivač na objekt klase

Ponovno možemo koristiti pokazivače dok dinamički dodjeljujemo memoriju objektima.

Pogledajmo primjer niza objekata.

#include using namespace std class Random {public: Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Izlaz:

Obrazloženje:

Konstruktor će se pozvati tri puta, jer dodijeljujemo memoriju trima objektima klase Random. Destruktor će se također pozvati tri puta tijekom svakog od ovih objekata. ‘Random * a = new Random [3]’ ova je izjava odgovorna za dinamičku dodjelu memorije našeg objekta.

Tako smo došli do kraja ovog članka o ‘Dinamičkoj dodjeli memorije C ++’. Ako želite saznati više, pogledajte Edureka, pouzdane tvrtke za internetsko učenje. Edurekin tečaj za obuku i certificiranje Java J2EE i SOA osmišljen je kako bi vas osposobio za osnovne i napredne Java koncepte zajedno s raznim Java okvirima poput Hibernate & Spring.

Imate pitanje za nas? Molimo vas da ga spominjete u odjeljku za komentare ovog bloga i javit ćemo vam se što je prije moguće.