Dynamisk minnetildeling i C ++

Dynamisk minnetildeling i C ++

Minnetildeling bestemmes på tidspunktet for variabel erklæring. Men i de fleste tilfeller vet vi ikke hvor mye minne som kreves for en spesifikk variabel. I så fall må minnetildeling gjøres på kjøretiden. Runtime Memory -tildelingen av programmet er kjent som dynamisk minnetildeling. I dynamisk minnetildeling vet vi ikke den faktiske størrelsen på variabelen. Vi tildeler minnet manuelt til den variabelen, og det kan også være en rekke eller objekt i en klasse. Pekere spiller en nøkkelrolle i dynamisk minnetildeling. Når vi dynamisk fordeler minnet, "ny”Søkeord brukes til å fortelle kompilatoren at vi dynamisk tildeler minnet. Når vi er ferdige med å tildele minnet, til slutt, må vi manuelt "slett”Det reserverte dynamiske minnet. På andre programmeringsspråk som Python og Java, trenger vi ikke å fordele minnet dynamisk fordi kompilatoren automatisk gjør det. Men i C og C ++, gjør vi dette manuelt ved å bruke ny (for å reservere plass) og slett (til ledig plass) Nøkkelord.

Hvorfor fordeler vi minnet dynamisk?

I C ++ gjøres dynamisk minnetildeling når vi ikke vet den faktiske størrelsen på variabelen eller elementene som vi ønsker å lagre i en variabel. De totale verdiene som må lagres avgjøres på kjøretiden. Heap tildeler det dynamiske minnet, men når det gjelder statisk, tilordnes minnet i en stabel. Så når vi ikke vet den nøyaktige størrelsen på variabler og det må gjøres på kjøretid, tildel minnet dynamisk.

Syntaks:

Reserve minne
Pointer_Variable = new Data_Type;

Først må vi reservere minnet i en haug. For det formålet definerer vi en pekertypevariabel lik "ny”Søkeord og definerer deretter typen variabel. “ny”Søkeord forbeholder seg minnet i haugen.

Vi kan også definere en variabel av array-typen.

Pointer_Variable = new Data_Type [Size];

For å initialisere variabelen, setter vi bare verdien i parentesen etter data_type () som dette:

Pointer_Variable = new Data_Type (verdi);
Gratis minne
slett peker_variabel;

Når vi er ferdige med den dynamiske minnetildelingen, må du dele minnet for å lagre dataene fra minnelekkasje. “slett”Nøkkelord med pekervariabelen Navnet frigjør det dynamiske minnet.

Dynamisk minnefordeling av variabel

La oss forklare tildelings- og forhandlingsprosessen for det dynamiske minnet til en variabel av heltallstypen.

Kode:

#inkludere
ved hjelp av navneområdet STD;
int main ()
int* p_value = null;
p_value = ny int;
*p_value = 674;
cout<< "Value of p_valueis : " << *p_value<slett p_value;
retur 0;

Start denne koden med å inkludere overskriftsfilen for å få tilgang til input- og utgangsmetodene til biblioteket. Dette biblioteket har innebygde metoder som vi kan få tilgang til i programmet vårt. Nå kan du ringe Main () -metoden og definere en pekervariabel "*P_Value" for å holde heapadressen siden den dynamiske minnetildelingen er gjort i haugen. Den statiske tildelingen gjøres i stabelen fordi vi allerede vet at datamengden betyr størrelsen på variabelen. Initialiser heltallpekeren med “Null”.

Tildel deretter pekeren "P_Value" -variabelenes dynamiske minne med det "nye" nøkkelordet og "int" datatypen til variabelen. Ved å bruke begrepet "nytt", blir kompilatoren instruert om å tildele hahapeminne for heltallstypevariabelen. I tillegg lagrer en verdi av “674” i pekertypen “*p_value” variabel. Kjør deretter "cout" -kommandoen for å skrive ut "verdien av p_value" -linjen og verdien av heltall "*p_value" -variabelen som er dynamisk lagret i haugen. For å hente dataene som er lagret i haugen, bruker vi pekeren. Pekeren lagrer og får tilgang til dataene i haugen; Det får ikke direkte tilgang til dataene. Bruk deretter kommandoen "Slett" for å slette pekertypen "P_Value" -variabelen slik at vi ikke mister dataene våre, eller ingen andre kan få tilgang til dataene våre.

Produksjon:

Verdien av P_Value er: 674

Dynamisk minnefordeling av et klasseobjekt

La oss definere en klasse og fordele minnet dynamisk til dets objekter i denne illustrasjonen.

Kode:

#inkludere
ved hjelp av navneområdet STD;
klasseprogram_0
offentlig:
Program_0 ()
cout<< "I am Constructor" <
~ Program_0 ()
cout<< "I am Destructor" <
;
int main ()
Program_0* myArray = new Program_0 [3];
slett [] myarray;
retur 0;

I denne koden, integrerer biblioteket for å bruke "cout" -metoden. Bruk deretter standard navneområdet. Definer en "program_0" -klasse og sett denne klassen som offentlig. De offentlige klassemetodene kan nås utenfor klassen. De andre klassene kan også få tilgang til metodene i denne klassen. Definer konstruktøren og destruktøren i denne klassen. Vi initialiserer datamedlemmene i klassen i konstruktøren. Destructor ødelegger objektene når programmet er utført. Det frigjør minnet etter at oppgaven er gjort. De er begge definert med klassenavnet.

I program_0 () -konstruktøren skriver vi en kodelinje for å skrive ut en melding på terminalen. Tilsvarende, i ~ program_0 () destruktør, viser du en melding ved å kjøre "cout" -uttalelsen. Hver gang klasseobjektet opprettes, kalles konstruktørene og destruktørene. Når vi ringer til den aktuelle klassen, utfører den konstruktøren og utfører deretter andre operasjoner som vi tildeler den. Etter å ha fullført prosessen, kalles destruktøren, og den ødelegger alle objektene som er opprettet for å få tilgang til klassemetodene og datamedlemmer.

Kjør dessuten main () -funksjonen til denne koden. Hver klasse kalles og objektene opprettes innenfor denne metoden. Opprett en pekertype “*MyArray” -objekt av “Program_0” -klassen og tildel det dynamiske minnet til det ved hjelp av det "nye" nøkkelordet. Her definerer vi størrelsen på matrise 3. Klassen heter tre ganger, og konstruktøren kjøres også tre ganger. Etter alt dette kalles destruktøren tre ganger for å frigjøre plassen. Destructor sletter objektet som kaller klassen tre ganger.

Produksjon:

Jeg er konstruktør
Jeg er konstruktør
Jeg er konstruktør
Jeg er destruktør
Jeg er destruktør
Jeg er destruktør

Konklusjon

Dette dokumentet analyserer den dynamiske minnetildelingen i C++. Vi observerer også hvorfor vi dynamisk fordeler minnet. Dynamisk minnetildeling er viktig når vi ikke vet den faktiske størrelsen på dataene som skal lagres. På andre språk som Python trenger ikke programmerere å tildele minnet manuelt fordi kompilatoren gjør det automatisk. Etter å ha tildelt minnet, lagret dataene der og gitt tilgang til det, blir minnet omgjort. Deallocation er viktig fordi hvis vi ikke omhandler minnet, er det en sjanse for minnelekkasje. Den dynamiske minnetildelingen av en heltallvariabel og et klasseobjekt forklares i kodene til denne guiden.