Sådan arbejder du med dynamisk hukommelsesallokering C ++?



Denne artikel udforsker dynamisk hukommelsesallokering i C ++, en vigtig funktion, der giver dig mulighed for at overveje dine hukommelsesbehov til realtidsressourcer.

Dynamisk hukommelsesallokering I C ++ er en meget vigtig funktion, der lader dig overveje dine behov for at håndtere behovet for ressourcer i realtid. I denne artikel ville vi udforske Efterforskning i detaljer. Følgende markører vil blive dækket af denne artikel,

Så lad os komme i gang med denne artikel om dynamisk hukommelsesallokering i C ++





Brug for dynamisk hukommelsesallokering?

Lad os sige, vi ønsker at indtaste en sætning som en række af tegn, men vi er ikke sikre på det nøjagtige antal tegn, der kræves i arrayet.

Nu, mens vi erklærer tegnmatrixen, hvis vi specificerer dens størrelse mindre end størrelsen på den ønskede streng, får vi en fejl, fordi pladsen i hukommelsen, der er allokeret til arrayet, er mindre sammenlignet med størrelsen på inputstrengen. Hvis vi angiver dens størrelse, der er større end størrelsen på inputstrengen, tildeles arrayet et mellemrum i hukommelsen, der er meget større end størrelsen på den ønskede streng, og derved unødvendigt bruger mere hukommelse, selv når det ikke er nødvendigt.



instansdata for en java-klasse

I ovenstående tilfælde har vi ikke idéen om den nøjagtige størrelse af arrayet før kompileringstiden (når computeren kompilerer koden, og strengen indtastes af brugeren). I sådanne tilfælde bruger vi ny operatør.

C ++ definerer to unary operatorer ny og slet der udfører opgaven med at allokere og distribuere hukommelse under kørselstid. Da disse operatører (ny og slet) fungerer på gratis lagerhukommelse (Heap-hukommelse) kaldes de også gratis butiksoperatør. Markører giver den nødvendige support til dynamisk hukommelsesallokeringssystem i C ++.

Ved hjælp af dynamisk allokering kan et program få hukommelse i løbet af løbetiden.



De globale og lokale variabler tildeles hukommelse under kompileringstid. Vi kan dog ikke tilføje nogen globale eller lokale variabler under løbetiden. Hvis programmet har brug for en variabel mængde hukommelse, skal vi allokere hukommelse under kørsel, når og når det er nødvendigt. Og selvfølgelig kan de dynamiske tildelingsrutiner tjene formålet.

Forskelle mellem statisk hukommelsesallokering og dynamisk hukommelsestildeling:

Dette er en grundlæggende hukommelsesarkitektur, der bruges til ethvert C ++ - program:

Hukommelse - Dynamisk hukommelsesallokering - Edureka

Vi har brug for et billede som dette

Stakken bruges til statisk hukommelsesallokering og Heap til dynamisk hukommelsesallokering, begge er gemt i computerens RAM.

Variabler, der tildeles på stakken, mens statisk hukommelsesallokering er gemt direkte i hukommelsen, og adgangen til denne hukommelse er meget hurtig, og dens allokering behandles også, når programmet kompileres. Når en funktion eller en metode kalder en anden funktion, som måske igen kalder en anden funktion og så videre, forbliver udførelsen af ​​alle disse funktioner suspenderet, indtil den sidste funktion returnerer sin værdi. Stakken er altid gemt i en LIFO-rækkefølge (sidst i først ud), den senest reserverede blok er altid den næste blok, der frigøres. Dette hjælper med at holde styr på stakken, det er intet andet end at justere en markør at frigøre en blok fra stakken.

Variabler, der er allokeret på bunken, har deres hukommelse allokeret ved kørselstid, mens dynamisk hukommelsesallokering. Adgang til denne hukommelse er lidt langsommere sammenlignet med stack, men størrelsen på bunken er kun begrænset af størrelsen på den virtuelle hukommelse. Elementet i bunken har ingen afhængigheder med hinanden og kan altid tilgås tilfældigt til enhver tid. Vi kan tildele en blok til enhver tid og frigøre den til enhver tid. Dette gør det vanskeligt at holde styr på, hvilke dele af bunken der tildeles eller deallokeres til enhver tid.

Fortsætter med denne artikel om dynamisk hukommelsesallokering i C ++

Tildeling af hukommelse vha ny Nøgleord

I C ++ er ny operatør bruges til at allokere hukommelse ved kørsel, og hukommelsen allokeres i byte. Det ny operatør angiver en anmodning om dynamisk hukommelsestildeling på bunken. Hvis der er tilstrækkelig hukommelse til rådighed, ny operatør initialiserer hukommelsen og returnerer adressen på den nyligt tildelte og initialiserede hukommelse til markørvariablen.

Syntaks:

datatype * pointer_name = ny datatype

Eksempel:

int * ptr = new int // Vi kan erklære en variabel under dynamisk fordeling på følgende to måder. int * ptr = new int (10) int * ptr = new int {15} // ny operator bruges også til at allokere en blok (et array) af hukommelse af typen datatype. int * ptr = new int [20] // Ovenstående sætning tildeler dynamisk hukommelse til 20 heltal kontinuerligt af typen int og returnerer en markør til det første element i sekvensen til 'ptr' -markøren.

Bemærk : Hvis bunken ikke har nok hukommelse til at allokere, indikerer den nye anmodning fiasko ved at kaste en undtagelse std :: bad_alloc, medmindre “nothrow” bruges med den nye operatør, i hvilket tilfælde den returnerer en NULL-markør. Derfor er det en god praksis at kontrollere, om markørvariablen er produceret af new, inden den bruges i programmet.

Fortsætter med denne artikel om dynamisk hukommelsesallokering i C ++

Distribution af hukommelse vha slet Nøgleord:

Når bunkehukommelse er allokeret til en variabel eller klasseobjekt ved hjælp af ny nøgleord, kan vi deallokere det hukommelsesrum ved hjælp af slet nøgleord.

Syntaks:

slet pointer_variable // Her er pointer_variable den markør, der peger på dataobjektet oprettet af new. slet [] pointer_variable // For at frigøre den dynamisk tildelte arrayhukommelse peget af pointer-variabel bruger vi følgende form for sletning:

Eksempel:

slet ptr slet [] ptr

Bemærk : Objektets omfang eller objektets levetid er det tidspunkt, objektet forbliver i hukommelsen under programudførelsen. Allokering af bunkehukommelse er langsommere end en stak, da der i bunke ikke er nogen bestemt rækkefølge, hvor du kan allokere hukommelse, mens den i stakken følger LIFO.

Fortsætter med denne artikel om dynamisk hukommelsesallokering i C ++

Dynamisk tildeling af arrays

Den største anvendelse af begrebet dynamisk hukommelsesallokering er tildeling af hukommelse til et array, når vi skal erklære det ved at specificere dets størrelse, men er ikke sikre på det.

Lad os se et eksempel for at forstå dets anvendelse.

#include ved hjælp af namespace std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * marks = new int [len] // Dynamisk hukommelsesallokering<< 'Enter the marks of each student' << endl for( int i = 0 i>* (markerer + i)} for (int i = 0 i

Forklaring:
I dette eksempel beder vi først brugeren om antallet af studerende i en klasse, og vi gemmer dens værdi i len-variablen. Derefter erklærer vi et array af heltal og tildeler det plads i hukommelsen dynamisk lig med den værdi, der er gemt i len-variablen ved hjælp af denne sætning int * marks = new int [længde], så det tildeles et mellemrum svarende til 'længde * (størrelse på 1 heltal)'. Resten af ​​koden er selvforklarende.

Fortsætter med denne artikel om dynamisk hukommelsesallokering i C ++

Dynamisk hukommelsesallokering til objekter

Vi kan også allokere objekter dynamisk.

Som vi ved, at Constructor brugte en speciel klassemedlemfunktion til at initialisere et objekt, og Destructor er også en klassemedlemfunktion, der kaldes, når objektet går uden for rækkevidde.

Destructor kan bruges til at frigøre den hukommelse, der er tildelt objektet. Det kaldes under følgende betingelser.

  • Når et lokalt objekt går ud af omfanget
  • For et globalt objekt, når en operator anvendes til en markør til klassens objekt

Vi kan igen bruge peger, mens vi dynamisk tildeler hukommelse til objekter.

Lad os se et eksempel på en række objekter.

#include ved hjælp af namespace std klasse Tilfældig {offentlig: Tilfældig () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Produktion:

Forklaring:

at komme i gang med visuelt studie

Konstruktøren bliver kaldt tre gange, da vi tildeler hukommelse til tre objekter i klassen Tilfældig. Destructor kaldes også tre gange under hvert af disse objekter. 'Tilfældig * a = ny tilfældig [3]' denne erklæring er ansvarlig for dynamisk hukommelsesallokering af vores objekt.

Således er vi nået til slutningen af ​​denne artikel om 'Dynamic Memory Allocation C ++'. Hvis du ønsker at lære mere, skal du tjekke af Edureka, et betroet online læringsfirma. Edurekas Java J2EE- og SOA-uddannelses- og certificeringskursus er designet til at træne dig til både kerne- og avancerede Java-koncepter sammen med forskellige Java-rammer som Hibernate & Spring.

Har du et spørgsmål til os? Nævn det i kommentarsektionen på denne blog, og vi vender tilbage til dig hurtigst muligt.