Hvordan jobbe med dynamisk minnetildeling C ++?

Denne artikkelen utforsker Dynamic Memory Allocation In C ++, en viktig funksjon som lar deg vurdere minnebehovet ditt for sanntidsressurser.

Dynamic Memory Allocation In C ++ er en veldig viktig funksjon som lar deg vurdere dine behov for å håndtere behovet for sanntidsressurser. I denne artikkelen vil vi utforske Utforsking i detalj. Følgende tips vil bli dekket i denne artikkelen,

Så la oss komme i gang med denne artikkelen om Dynamic Memory Allocation i C ++



Behov for dynamisk minnetildeling?

La oss si, vi vil legge inn en setning som en rekke tegn, men vi er ikke sikre på nøyaktig antall tegn som kreves i matrisen.

Nå, mens vi deklarerer tegnmatrisen, hvis vi spesifiserer størrelsen mindre enn størrelsen på ønsket streng, vil vi få en feil fordi plassen i minnet som er allokert til matrisen, er mindre sammenlignet med størrelsen på inngangsstrengen. Hvis vi spesifiserer størrelsen større enn størrelsen på inngangsstrengen, vil matrisen tildeles et mellomrom i minnet som er mye større enn størrelsen på ønsket streng, og dermed unødvendig forbruker mer minne selv når det ikke er nødvendig.

I ovennevnte tilfelle har vi ikke ideen om den eksakte størrelsen på matrisen før kompileringstiden (når datamaskinen kompilerer koden og strengen blir lagt inn av brukeren). I slike tilfeller bruker vi ny operatør.

C ++ definerer to unary operatorer ny og slett som utfører oppgaven med å tildele og distribuere minne i løpet av kjøretiden. Siden disse operatørene (nye og slette) opererer med gratis butikkminne (Heap-minne), kalles de også gratis butikkoperatør. Pekere gir nødvendig støtte for dynamisk minnetildelingssystem i C ++.

Ved hjelp av Dynamic Allocation kan et program skaffe minne i løpet av kjøretiden.

De globale og lokale variablene tildeles minne under kompileringstiden. Vi kan imidlertid ikke legge til noen globale eller lokale variabler i løpet av kjøretiden. Hvis programmet trenger å bruke en variabel mengde minne, må vi tildele minne i løpet av kjøretiden, etter behov. Og selvfølgelig, her kan de dynamiske tildelingsrutinene tjene formålet.

Forskjeller mellom statisk minnetildeling og dynamisk minnetildeling:

Dette er en grunnleggende minnearkitektur som brukes til ethvert C ++ - program:

Minne - Dynamisk minnetildeling - Edureka

Vi trenger et bilde som dette

Stakken brukes til statisk minnetildeling og Heap for dynamisk minnetildeling, begge er lagret i datamaskinens RAM.

Variabler som blir tildelt på stakken mens statisk minnetildeling lagres direkte i minnet og tilgangen til dette minnet er veldig rask, også blir allokasjonen behandlet når programmet kompileres. Når en funksjon eller en metode kaller en annen funksjon som i sin tur kan kalle en annen funksjon og så videre, blir utførelsen av alle disse funksjonene fortsatt suspendert til den aller siste funksjonen returnerer sin verdi. Bunken lagres alltid i en LIFO-rekkefølge (sist i først ut), den sist reservert blokken er alltid den neste blokken som skal frigjøres. Dette hjelper til med å holde oversikt over stakken, og frigjøre en blokk fra stakken er ikke mer enn å justere en peker.

Variabler som er tildelt på dyngen, har minne tildelt på kjøretid mens dynamisk minnetildeling. Å få tilgang til dette minnet er litt tregere sammenlignet med stabelen, men størrelsen på dyngen er bare begrenset av størrelsen på det virtuelle minnet. Elementet i dyngen har ingen avhengigheter med hverandre og kan alltid nås tilfeldig når som helst. Vi kan tildele en blokk når som helst og frigjøre den når som helst. Dette gjør det vanskelig å holde oversikt over hvilke deler av dyngen som tildeles eller distribueres til enhver tid.

Fortsetter med denne artikkelen om Dynamic Memory Allocation i C ++

offentlig strengstreng ()

Tildeling av minne ved hjelp av ny Nøkkelord

I C ++ er ny operatør brukes til å tildele minne ved kjøretid, og minnet tildeles i byte. De ny operatør angir en forespørsel om dynamisk minnetildeling på bunken. Hvis tilstrekkelig minne er tilgjengelig, vil ny operatøren initialiserer minnet og returnerer adressen til det nylig tildelte og initialiserte minnet til pekervariabelen.

Syntaks:

datatype * pointer_name = ny datatype

Eksempel:

int * ptr = new int // Vi kan erklære en variabel mens dynamisk tildeling er på følgende to måter. int * ptr = new int (10) int * ptr = new int {15} // ny operator brukes også til å tildele en blokk (en matrise) av minne av typen datatype. int * ptr = new int [20] // Ovennevnte setning tildeler dynamisk minne for 20 heltall kontinuerlig av typen int og returnerer en peker til det første elementet i sekvensen til ‘ptr’ -pekeren.

Merk : Hvis haugen ikke har nok minne til å tildele, indikerer den nye forespørselen feil ved å kaste et unntak std :: bad_alloc, med mindre “nothrow” brukes med den nye operatøren, i hvilket tilfelle den returnerer en NULL-peker. Derfor er det en god praksis å se etter pekervariabelen produsert av new før du bruker den i programmet.

Fortsetter med denne artikkelen om Dynamic Memory Allocation i C ++

Distribusjon av minne ved hjelp av slett Nøkkelord:

Når heapminne er allokert til en variabel eller klasseobjekt ved hjelp av ny nøkkelord, kan vi plassere minneplassen ved hjelp av slett nøkkelord.

Syntaks:

delete pointer_variable // Her er pointer_variable pekeren som peker på dataobjektet opprettet av nytt. delete [] pointer_variable // For å frigjøre det dynamisk tildelte arrayminnet pekt av pekervariabelen, bruker vi følgende form for delete:

Eksempel:

slett ptr slett [] ptr

Merk : Objektets omfang eller objektets levetid er tiden objektet forblir i minnet under programutførelsen. Heap Memory-tildeling er tregere enn en stabel, siden det i heap ikke er noen spesiell rekkefølge du kan tildele minne, mens det i stacken følger LIFO.

Fortsetter med denne artikkelen om Dynamic Memory Allocation i C ++

Dynamisk tildeling av matriser

Den viktigste bruken av begrepet dynamisk minnetildeling er for å tildele minne til en matrise når vi må erklære det ved å spesifisere størrelsen, men er usikre på det.

La oss se, et eksempel for å forstå bruken.

# inkludere bruk av navneområdet std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * marks = new int [len] // Dynamisk minnetildeling<< 'Enter the marks of each student' << endl for( int i = 0 i>* (merker + i)} for (int i = 0 i

Forklaring:
I dette eksemplet ber vi først brukeren om antall studenter i en klasse, og vi lagrer verdien i len-variabelen. Deretter erklærer vi en rekke med heltall og tildeler det plass i minnet dynamisk lik verdien som er lagret i lenvariabelen ved hjelp av denne setningen int * marks = new int [length], slik at den tildeles et space lik 'lengde * (størrelse 1 heltall) '. Resten av koden er selvforklarende.

Fortsetter med denne artikkelen om Dynamic Memory Allocation i C ++

hva er marionett og kokk

Dynamisk minnetildeling for objekter

Vi kan også allokere objekter dynamisk.

Som vi vet at Constructor brukte en spesiell klassemedlemfunksjon for å initialisere et objekt og Destructor er også en klassemedlemfunksjon som kalles når objektet går utenfor omfanget.

Destructor kan brukes til å frigjøre minnet som er tildelt objektet. Det kalles i følgende forhold.

  • Når et lokalt objekt går utenfor omfanget
  • For et globalt objekt, når en operator blir brukt på en peker til objektet til klassen

Vi kan igjen bruke pekere mens vi dynamisk tildeler minne til objekter.

La oss se et eksempel på en rekke objekter.

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

Produksjon:

Forklaring:

Konstruktøren vil bli ringt opp tre ganger siden vi tildeler minne til tre objekter i klassen Tilfeldig. Destructor vil også bli ringt opp tre ganger i løpet av hvert av disse objektene. ‘Random * a = new Random [3]’ denne uttalelsen er ansvarlig for dynamisk minnetildeling av objektet vårt.

Dermed har vi kommet til en slutt på denne artikkelen om ‘Dynamic Memory Allocation C ++’. Hvis du ønsker å lære mer, sjekk ut av Edureka, et pålitelig online læringsfirma. Edurekas Java J2EE- og SOA-opplærings- og sertifiseringskurs er designet for å trene deg for både kjerne- og avanserte Java-konsepter sammen med forskjellige Java-rammer som Hibernate & Spring.

Har du et spørsmål til oss? Vennligst nevn det i kommentarfeltet på denne bloggen, så kommer vi tilbake til deg så snart som mulig.