Dynamische geheugentoewijzing in C++

Dynamische Geheugentoewijzing In C



Normaal gesproken wijst een compiler bij het gebruik van broncodes in de programmeertaal C++ het geheugen handmatig toe aan de variabele voor de opslag van gegevens. Er wordt gezegd dat het een toewijzing van statisch geheugen is. Dit is een vast geheugen dat niet kan worden gewijzigd als het eenmaal is gedeclareerd. Voor dit type geheugentoewijzing gebruikt het besturingssysteem de stapel om gegevens op te slaan. Bij statische toewijzing wordt het geheugen toegewezen voordat de uitvoering van de broncode begint.

Terwijl bij de dynamische geheugentoewijzing het geheugen wordt toegewezen terwijl de uitvoering is gestart. Dit geheugen wordt tijdens runtime handmatig door de programmeur toegewezen, ook wel bekend als runtime-geheugentoewijzing in C ++. De grootte van het dynamische geheugen kan op elke positie in het programma worden gewijzigd, omdat we op het moment van declaratie geen grootte vermelden die kan worden vastgesteld. We geven de waarde alleen rechtstreeks aan de variabele.

Verschil in geheugentoewijzing voor normale variabelen

Bij normale variabelen wordt het geheugen dat door een compiler is toegewezen, automatisch toegewezen en ongedaan gemaakt. Wanneer het geheugen dynamisch wordt toegewezen door de programmeur, moet hij het geheugen verwijderen of de toewijzing ongedaan maken wanneer het geen nut heeft bij de verdere uitvoering van de broncode. Deze situatie veroorzaakt een 'geheugenlek' wanneer het programma wordt beëindigd terwijl het geheugen niet ongedaan wordt gemaakt.







Operatoren voor dynamische toewijzing

In C ++ helpen twee operators bij het toewijzen en vrijgeven van geheugen: 'nieuw' en 'verwijderen' die worden gebruikt voor het op een betere manier toewijzen en vrijgeven van het geheugen.



Nieuwe exploitant

Het betekent de vraag naar geheugentoewijzing. De operator new initialiseert het geheugen en stuurt het adres van dat toegewezen geheugen terug naar de pointervariabele als er voldoende geheugen beschikbaar is.



Pointer-object = nieuwe gegevens - type ;

Operator verwijderen

Net als de nieuwe operator wordt een delete-operator gebruikt om het toegewezen geheugen te verwijderen. In C++ kan de programmeur deze operator gebruiken voor deallocatie.





# Verwijder pointer_variabele;

voorbeeld 1

In dit voorbeeld introduceren we twee pointers: de ene is een integer-type pointer en de andere is een float-pointer. Aanwijzers worden geïnitialiseerd door er een sterretje bij te gebruiken.

# Int * puntInt;
# Zweven *puntzweven;

Door deze twee printers te gebruiken, zullen we het geheugen dynamisch toewijzen.



Rol van pointers bij dynamische toewijzing:
Het geheugen van opslagruimte is ontwikkeld in de vorm van blokken. Telkens wanneer we een programma uitvoeren of een bewerking uitvoeren, wordt het geheugen voor dat specifieke doel toegewezen. Dat geheugen heeft een speciaal adres dat is gekoppeld aan het programma dat identificeert welk proces of programma is toegestaan ​​voor dat geheugen. Elk geheugenslot is toegankelijk via het adres waartoe het behoort. Dit adres wordt dus opgeslagen via de pointers. Kortom, we hebben aanwijzers nodig om toegang te krijgen tot het geheugen en op dezelfde manier om een ​​specifiek deel van het geheugen aan een taak toe te wijzen. Pointers zijn nodig om adressen op te slaan.

Aangezien het sleutelwoord 'nieuw' wordt gebruikt voor de dynamische toewijzing van geheugen bij handmatige toewijzing, wordt het geheugen toegewezen door de compiler. We hoeven tijdens runtime geen geheugen toe te wijzen. Maar aangezien dynamische toewijzing willekeurig is, moeten we de pointers identificeren en voor het bindingsproces wordt deze nieuwe operator gebruikt.

# Pointint = nieuwe int;

Evenzo is de zwevende aanwijzer op dezelfde manier gebonden. Na het bindingsproces zullen we elke waarde toewijzen aan het geheugen dat we voor elke bewerking willen boeken. Door de aanwijzer te declareren, kennen we een specifieke waarde toe aan het geheugen.

# *puntInt = 50;

Er wordt ook een float-waarde voor de point floats aangegeven. Geef de waarden weer na het toewijzen.

Zoals we hebben besproken, wordt de 'nieuwe' operator gebruikt om toe te wijzen, terwijl 'verwijderen' wordt gebruikt om geheugen vrij te geven. Dus zodra u de taak of bewerking in de code hebt voltooid, verwijderen we het geheugen dat we aan de taak hebben toegewezen.

Het is beter om dat deel van het geheugen ongedaan te maken, zodat elk ander proces hier gebruik van kan maken. We passen deze toewijzing toe op beide pointers.

Verwijder punt vlot ;

Nadat u de code in de teksteditor hebt opgeslagen, kunt u met de Ubuntu-terminal de broncode in het bestand uitvoeren via een g ++ -compiler.

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

Bij uitvoering ziet u de waarden die aan het geheugen zijn toegewezen.

Voorbeeld 2

Dit voorbeeld heeft de betrokkenheid van gebruikersinteractie. We nemen een nummervariabele die een waarde van de gebruiker bevat. Dit programma slaat het resultaat op in het GPA van de studenten. Alle resultaten worden tijdens runtime opgeslagen.

Wanneer de gebruiker het aantal studenten invoert, wordt geheugen toegewezen aan elk nummer. Hier wordt een zwevende aanwijzer geïnitialiseerd die zal worden gebruikt bij de geheugentoewijzing van de resultaten.

We nemen de aanwijzer in float omdat GPA in decimale notatie is. We nemen een array van het pointertype voor de GPA, omdat deze kan resulteren in een aantal studenten.

Ptr = nieuwe vlot [ op een ]

Deze pointerarray met het sleutelwoord 'new' bindt de uitvoering met het geheugen. Voor elke student wordt het GPA ingevuld. Omdat we niet bekend zijn met het aantal studenten dat de gebruiker wil toevoegen, hebben we een for-lus gebruikt om de GPA in te voeren tot aan het ingevoerde aantal. Bij elke herhaling van de lus wordt de gebruiker gevraagd het resultaat in te voeren dat de student identificeert. Zodra het resultaat is opgeslagen, gebruiken we opnieuw een lus om alle GPA's van de studenten weer te geven. Uiteindelijk wordt de array van het pointertype verwijderd, omdat het doel van dynamische opslag is bereikt.

Verwijderen [ ] ptr ;

Nu gaan we de bovengenoemde code uitvoeren. De gebruiker wordt eerst gevraagd om het aantal studenten in te voeren. Vervolgens wordt het GPA voor elke student ingevoerd.

Voorbeeld 3

In dit voorbeeld worden de operatoren new en delete gebruikt voor het object van de klasse. Deze klasse bevat een privévariabele van het type integer waarin de leeftijd wordt opgeslagen. In het openbare deel van een klas wordt de constructor gemaakt die de leeftijd initialiseert naar een getal '10'. Hier wordt een andere functie gebruikt die de leeftijd weergeeft die in de constructor is geïnitialiseerd.

Nu gaan we naar het hoofdprogramma voor de dynamische toewijzing. Het object van de klasse wordt dynamisch gemaakt.

Leerling * ptr = nieuwe leerling ( ) ;

Wanneer het object is gevormd, wordt de constructor automatisch geïmplementeerd. Er zal een functieoproep worden gedaan om de leeftijd te krijgen. Dit zal gebeuren via de ptr.

Ptr - > getLeeftijd ( ) ;

En aan het einde zal de herinnering worden vrijgegeven.

Conclusie

Dynamische geheugentoewijzing wordt tijdens uitvoering door de programmeur toegewezen in plaats van vaste opslag die door de compiler wordt geïdentificeerd. Deze toewijzing vindt willekeurig plaats en kan na gebruik worden geëlimineerd. Terwijl in de meeste gevallen vóór de verwijdering het uitvoeringsproces stopt en deze dynamische toewijzing vervolgens de geheugenlekken veroorzaakt. We hebben dit fenomeen op verschillende manieren geïmplementeerd in het Ubuntu Linux-systeem met behulp van de programmeertaal C++.