Hoe te werken met dynamische geheugentoewijzing C ++?



Dit artikel onderzoekt dynamische geheugentoewijzing in C ++, een belangrijke functie waarmee u rekening kunt houden met uw geheugenbehoeften voor realtime bronnen.

Dynamische geheugentoewijzing in C ++ is een zeer belangrijke functie waarmee u uw vereisten kunt overwegen om aan de behoefte aan realtime bronnen te voldoen. In dit artikel zouden we het verkennen Verkenning in detail. Volgende aanwijzingen komen in dit artikel aan bod,

Dus laten we aan de slag gaan met dit artikel over dynamische geheugentoewijzing in C ++





Dynamische geheugentoewijzing nodig?

Laten we zeggen dat we een zin willen invoeren als een reeks tekens, maar we zijn niet zeker over het exacte aantal vereiste tekens in de reeks.

Als we nu, terwijl we de tekenreeks declareren, de grootte specificeren die kleiner is dan de grootte van de gewenste string, dan krijgen we een foutmelding omdat de ruimte in het geheugen dat aan de array is toegewezen kleiner is in vergelijking met de grootte van de invoertekenreeks. Als we de grootte van de string groter specificeren dan de grootte van de invoertekenreeks, krijgt de array een ruimte in het geheugen toegewezen die veel groter is dan de grootte van de gewenste string, waardoor onnodig meer geheugen wordt verbruikt, zelfs als dit niet nodig is.



In het bovenstaande geval hebben we geen idee over de exacte grootte van de array tot de compilatie (wanneer de computer de code compileert en de string wordt ingevoerd door de gebruiker). In dergelijke gevallen gebruiken we de nieuw operator.

C ++ definieert twee unaire operatoren nieuw en verwijderen die de taak uitvoeren van het toewijzen en ongedaan maken van de toewijzing van geheugen tijdens runtime. Omdat deze operators (nieuw en delete) werken met vrij opslaggeheugen (Heap-geheugen), worden ze ook wel gratis opslagoperator genoemd. Pointers bieden de nodige ondersteuning voor een dynamisch geheugentoewijzingssysteem in C ++.

Met behulp van Dynamic Allocation kan een programma tijdens runtime geheugen verkrijgen.



De globale en lokale variabelen worden tijdens het compileren aan het geheugen toegewezen. We kunnen tijdens runtime echter geen globale of lokale variabelen toevoegen. Als het programma een variabele hoeveelheid geheugen moet gebruiken, moeten we geheugen toewijzen tijdens runtime, wanneer dat nodig is. En natuurlijk kunnen hier de dynamische toewijzingsroutines het doel dienen.

Verschillen tussen statische geheugentoewijzing en dynamische geheugentoewijzing:

Dit is een basisgeheugenarchitectuur die wordt gebruikt voor elk C ++ -programma:

Geheugen - Dynamische geheugentoewijzing - Edureka

We hebben een afbeelding als deze nodig

De stapel wordt gebruikt voor statische geheugentoewijzing en Heap voor dynamische geheugentoewijzing, beide worden opgeslagen in het RAM van de computer.

Variabelen die worden toegewezen op de stapel terwijl statische geheugentoewijzing rechtstreeks in het geheugen wordt opgeslagen en de toegang tot dit geheugen erg snel is, ook de toewijzing ervan wordt afgehandeld wanneer het programma wordt gecompileerd. Wanneer een functie of methode een andere functie aanroept die op zijn beurt een andere functie kan aanroepen, enzovoort, blijft de uitvoering van al deze functies onderbroken totdat de allerlaatste functie zijn waarde teruggeeft. De stapel wordt altijd opgeslagen in een LIFO-volgorde (last in first out), het meest recent gereserveerde blok is altijd het volgende blok dat moet worden vrijgemaakt. Dit helpt om de stapel bij te houden, een blok vrijmaken van de stapel is niets meer dan één aanwijzer aanpassen.

Aan variabelen die op de heap zijn toegewezen, wordt het geheugen toegewezen tijdens runtime terwijl het dynamische geheugen wordt toegewezen. Toegang tot dit geheugen is iets langzamer in vergelijking met stack, maar de grootte van de heap wordt alleen beperkt door de grootte van het virtuele geheugen. Het element van de heap heeft geen onderlinge afhankelijkheid en is altijd willekeurig op elk moment toegankelijk. We kunnen op elk moment een blok toewijzen en op elk moment vrijmaken. Dit maakt het moeilijk om bij te houden welke delen van de heap op een bepaald moment zijn toegewezen of ongedaan gemaakt.

php zet string om in array

Verderop met dit artikel over dynamische geheugentoewijzing in C ++

Toewijzing van geheugen met nieuw Trefwoord

In C ++ is het nieuw operator wordt gebruikt om geheugen toe te wijzen tijdens runtime en het geheugen wordt toegewezen in bytes. De nieuw operator geeft een verzoek aan voor dynamische geheugentoewijzing op de heap. Als er voldoende geheugen beschikbaar is, is het nieuw operator initialiseert het geheugen en stuurt het adres van het nieuw toegewezen en geïnitialiseerde geheugen terug naar de pointervariabele.

Syntaxis:

datatype * pointer_name = nieuw datatype

Voorbeeld:

int * ptr = new int // We kunnen een variabele declareren tijdens dynamische allocatie op de volgende twee manieren. int * ptr = new int (10) int * ptr = new int {15} // new operator wordt ook gebruikt om een ​​blok (een array) geheugen van het type data-type toe te wijzen. int * ptr = new int [20] // De bovenstaande instructie wijst dynamisch geheugen toe voor 20 gehele getallen van het type int en retourneert een pointer naar het eerste element van de reeks naar de ‘ptr’ pointer.

Opmerking : Als de heap niet genoeg geheugen heeft om toe te wijzen, geeft het nieuwe verzoek een mislukking aan door een uitzondering std :: bad_alloc te genereren, tenzij 'nothrow' wordt gebruikt met de nieuwe operator, in welk geval het een NULL-pointer retourneert. Daarom is het een goede gewoonte om te controleren op de pointervariabele geproduceerd door new voordat u deze in het programma gebruikt.

Verderop met dit artikel over dynamische geheugentoewijzing in C ++

De toewijzing van geheugen met behulp van verwijderen Trefwoord:

Zodra heap-geheugen is toegewezen aan een variabel of klasseobject met behulp van de nieuw trefwoord, kunnen we die geheugenruimte ongedaan maken met de verwijderen trefwoord.

Syntaxis:

delete pointer_variable // Hier is pointer_variable de aanwijzer die verwijst naar het data-object dat is gemaakt door new. delete [] pointer_variable // Om het dynamisch toegewezen arraygeheugen vrij te maken, aangewezen door pointer-variable, gebruiken we de volgende vorm van verwijderen:

Voorbeeld:

verwijderen ptr verwijderen [] ptr

Opmerking : De omvang van het object of de levensduur van het object is de tijd gedurende welke het object in het geheugen blijft tijdens de uitvoering van het programma. Heap-geheugentoewijzing is langzamer dan een stapel, omdat er in heap geen specifieke volgorde is waarin u geheugen kunt toewijzen, terwijl het in de stapel LIFO volgt.

Verderop met dit artikel over dynamische geheugentoewijzing in C ++

Arrays dynamisch toewijzen

Het belangrijkste gebruik van het concept van dynamische geheugentoewijzing is voor het toewijzen van geheugen aan een array wanneer we het moeten declareren door de grootte te specificeren, maar er niet zeker van zijn.

Laten we eens kijken, een voorbeeld om het gebruik ervan te begrijpen.

#include met behulp van de naamruimte std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * marks = new int [len] // Dynamische geheugentoewijzing cout<< 'Enter the marks of each student' << endl for( int i = 0 i>* (markeringen + i)} voor (int i = 0 i

Uitleg:
In dit voorbeeld vragen we de gebruiker eerst naar het aantal leerlingen in een klas en slaan we de waarde op in de variabele len. Vervolgens declareren we een array van integer en wijzen deze dynamisch ruimte in het geheugen toe die gelijk is aan de waarde die is opgeslagen in de variabele len met behulp van deze instructie int * marks = new int [length], dus het krijgt een spatie toegewezen die gelijk is aan 'length * (size of 1 geheel getal)'. De rest van de code spreekt voor zich.

java maakt een reeks objecten

Verderop met dit artikel over dynamische geheugentoewijzing in C ++

Dynamische geheugentoewijzing voor objecten

We kunnen ook objecten dynamisch toewijzen.

Zoals we weten is Constructor een speciale class member-functie die wordt gebruikt om een ​​object te initialiseren en Destructor is ook een class member-functie die wordt aangeroepen wanneer het object buiten bereik gaat.

Destructor kan worden gebruikt om het geheugen vrij te geven dat aan het object is toegewezen. Het wordt aangeroepen in de volgende omstandigheden.

  • Wanneer een lokaal object buiten bereik valt
  • Voor een globaal object, wanneer een operator wordt toegepast op een pointer naar het object van de klasse

We kunnen weer pointers gebruiken terwijl we dynamisch geheugen aan objecten toewijzen.

Laten we een voorbeeld bekijken van een reeks objecten.

#include met gebruik van naamruimte std class Random {public: Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Uitgang:

Uitleg:

De Constructor wordt drie keer aangeroepen omdat we geheugen toewijzen aan drie objecten van de klasse Random. De Destructor wordt ook drie keer aangeroepen tijdens elk van deze objecten. ‘Random * a = new Random [3]’ Deze verklaring is verantwoordelijk voor de dynamische geheugentoewijzing van ons object.

Hiermee zijn we aan het einde gekomen van dit artikel over ‘Dynamic Memory Allocation C ++’. Als je meer wilt weten, bekijk dan de door Edureka, een vertrouwd online leerbedrijf. Edureka's Java J2EE- en SOA-trainings- en certificeringscursus is ontworpen om u te trainen in zowel kern- als geavanceerde Java-concepten samen met verschillende Java-frameworks zoals Hibernate & Spring.

Heeft u een vraag voor ons? Vermeld het in het opmerkingengedeelte van deze blog en we nemen zo snel mogelijk contact met je op.