Dynamisk hukommelsesallokering i C++

Dynamisk Hukommelsesallokering I C



Normalt, mens du bruger kildekoder i C++ programmeringssprog, allokerer en compiler hukommelsen manuelt til variablen til lagring af data. Det siges at være en allokering af statisk hukommelse. Dette er en fast hukommelse, som ikke kan ændres, når den først er erklæret. Til denne type hukommelsesallokering bruger operativsystemet stakken til at gemme data. Ved statisk allokering tildeles hukommelsen før kildekoden begynder at udføre.

Hvorimod hukommelsen i den dynamiske hukommelsesallokering tildeles, mens udførelsen er startet. Denne hukommelse tildeles manuelt af programmøren ved run-time, også kendt som en run-time memory-allokering i C++. Størrelsen af ​​dynamisk hukommelse kan ændres på en hvilken som helst position i programmet, fordi vi på tidspunktet for deklarationen ikke nævner en størrelse, der kan fastsættes. Vi giver kun værdien direkte til variablen.

Forskellen mellem hukommelsesallokering og normale variabler

I normale variabler allokeres og deallokeres hukommelsen, der er allokeret af en compiler, automatisk. Når hukommelsen allokeres dynamisk af programmøren, skal han fjerne eller deallokere hukommelsen, når den ikke er til nogen nytte i den videre eksekvering af kildekoden. Denne situation forårsager en 'hukommelseslækage', når programmet afsluttes, mens hukommelsen ikke er deallokeret.







Operatører til dynamisk allokering

I C++ hjælper to operatører med hukommelsesallokering og -deallokering: 'ny' og 'delete', der bruges til tildeling og deallokering af hukommelsen på en bedre måde.



Ny operatør

Det betyder efterspørgslen efter hukommelsesallokering. Den nye operatør initialiserer hukommelsen og returnerer adressen på den tildelte hukommelse til pointervariablen, hvis der er nok hukommelse til rådighed.



Pointer objekt = ny data - type ;

Slet operatør

Ligesom den nye operator bruges en sletoperator til at fjerne den tildelte hukommelse. I C++ kan programmør bruge denne operator til deallokering.





# Slet pointer_variable;

Eksempel 1

I dette eksempel vil vi introducere to pointere: den ene er en heltals-pointer og den anden er en flydende pointer. Pointere initialiseres ved at bruge et stjernetegn sammen med dem.

# Int * pointInt;
# Float *pointfloat;

Ved at bruge disse to printere vil vi dynamisk allokere hukommelsen.



Rolle af pointere i dynamisk tildeling:
Hukommelsen af ​​lagerplads udvikles i form af blokke. Hver gang vi udfører et program eller udfører en operation, er hukommelsen allokeret til det specifikke formål. Denne hukommelse har en speciel adresse, der er knyttet til programmet, der identificerer, hvilken proces eller et program, der er tilladt til denne hukommelse. Enhver hukommelsesplads er tilgængelig via den adresse, den tilhører. Så denne adresse er gemt gennem pointerne. Kort sagt, vi har brug for pointere for at få adgang til hukommelsen og på samme måde til at allokere en bestemt del af hukommelsen til enhver opgave. Der kræves pegepinde for at gemme adresser.

Da det 'nye' nøgleord bruges til den dynamiske allokering af hukommelse ved manuel allokering, allokeres hukommelsen af ​​compileren. Vi behøver ikke at allokere hukommelse under kørsel. Men da dynamisk allokering er tilfældig, er vi nødt til at identificere pointerne, og til bindingsprocessen bruges denne nye operator.

# Pointint = ny int;

På samme måde er den flydende pointer bundet på samme måde. Efter bindingsprocessen vil vi tildele enhver værdi til hukommelsen, som vi ønsker at reservere til enhver operation. Ved at erklære markøren tildeler vi en bestemt værdi til hukommelsen.

# *pointInt = 50;

En flydende værdi for point-floats er også deklareret. Vis værdierne efter tildeling.

Som vi har diskuteret, bruges den 'nye' operatør til at allokere, mens 'slet' bruges til at deallokere hukommelse. Så når du har gennemført opgaven eller operationen i koden, fjerner vi den hukommelse, vi har allokeret til opgaven.

Det er bedre at tildele den del af hukommelsen, så enhver anden proces kan benytte denne. Vi vil anvende denne tildeling på begge pointer.

Slet punkt flyde ;

Når du har gemt koden i teksteditoren, giver Ubuntu-terminalen dig mulighed for at udføre kildekoden inde i filen gennem en g++-kompiler.

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

Ved udførelse vil du se de værdier, der er tildelt hukommelsen.

Eksempel 2

Dette eksempel involverer brugerinteraktion. Vi tager en talvariabel, der vil indeholde en værdi fra brugeren. Dette program vil gemme resultatet i de studerendes GPA. Alle resultater vil blive gemt under kørslen.

Når brugeren indtaster antallet af elever, tildeles hukommelse mod hvert tal. En float-type pointer initialiseres her, som vil blive brugt i hukommelsesallokeringen af ​​resultaterne.

Vi tager markøren i flydende, da GPA er i decimalnotation. Vi tager en pointertype-array for GPA'en, da den kan resultere i et antal studerende.

Ptr = ny flyde [ på en ]

Dette pointer-array med det 'nye' nøgleord vil binde udførelsen med hukommelsen. GPA vil blive indtastet for hver studerende. Da vi ikke er bekendt med antallet af elever, brugeren ønsker at tilføje, brugte vi en for-løkke til at indtaste GPA op til det indtastede antal. I hver gentagelse af loopet bliver brugeren bedt om at indtaste resultatet, der identificerer eleven. Når resultatet er gemt, vil vi igen bruge en loop til at vise alle elevernes GPA'er. Til sidst slettes pointertype-arrayet, da formålet med dynamisk lagring blev opnået.

Slet [ ] ptr ;

Nu vil vi udføre ovennævnte kode. Brugeren vil først blive bedt om at indtaste antallet af elever. Derefter indtastes GPA for hver elev.

Eksempel 3

Dette eksempel bruger new og delete-operatorerne for klassens objekt. Denne klasse indeholder en privat variabel af heltalstypen, der gemmer alderen. I den offentlige del af en klasse oprettes konstruktøren, der vil initialisere alderen til et tal '10'. En anden funktion bruges her, som vil vise den alder, der er initialiseret i konstruktøren.

Nu vil vi gå til hovedprogrammet for den dynamiske tildeling. Klassens objekt skabes dynamisk.

Studerende * ptr = ny studerende ( ) ;

Når objektet er dannet, implementeres konstruktøren automatisk. Et funktionskald vil blive foretaget for at få alderen. Dette vil ske gennem ptr.

Ptr - > getAlder ( ) ;

Og til sidst vil hukommelsen blive frigivet.

Konklusion

Dynamisk hukommelsesallokering tildeles ved kørselstidsudførelsen af ​​programmøren i stedet for fast lager identificeret af compileren. Denne tildeling er tilfældig og kan elimineres, efter at den er brugt. Mens udførelsesprocessen i de fleste tilfælde stopper før fjernelsen, og denne dynamiske allokering forårsager derefter hukommelseslækage. Vi har implementeret dette fænomen i forskellige tilgange i Ubuntu Linux-systemet ved hjælp af C++ programmeringssprog.