Hur arbetar man med dynamisk minnesallokering C ++?



Den här artikeln utforskar Dynamic Memory Allocation In C ++, en viktig funktion som låter dig överväga dina minnesbehov för realtidsresurser.

Dynamisk allokering i C ++ är en mycket viktig funktion som låter dig överväga dina krav för att hantera behovet av realtidsresurser. I den här artikeln skulle vi utforska Utforskning i detalj. Följande tips kommer att behandlas i den här artikeln,

Så låt oss komma igång med den här artikeln om dynamisk minnesallokering i C ++





Behöver du dynamisk minnestilldelning?

Låt oss säga, vi vill skriva in en mening som en rad tecken men vi är inte säkra på det exakta antalet tecken som krävs i matrisen.

När vi deklarerar teckenmatrisen, om vi anger dess storlek mindre än storleken på den önskade strängen, kommer vi att få ett fel eftersom utrymmet i minnet som tilldelats matrisen är mindre jämfört med storleken på inmatningssträngen. Om vi ​​anger dess storlek som är större än storleken på ingångssträngen, kommer matrisen att tilldelas ett utrymme i minnet som är mycket större än storleken på den önskade strängen, och därmed onödigt konsumerar mer minne även när det inte krävs.



I ovanstående fall har vi inte idén om den exakta storleken på arrayen förrän kompileringstiden (när datorn kompilerar koden och strängen matas in av användaren). I sådana fall använder vi ny operatör.

C ++ definierar två unary operatorer ny och radera som utför uppgiften att allokera och distribuera minne under körning. Eftersom dessa operatörer (nya och radera) arbetar med fritt lagringsminne (Heap-minne) kallas de också för fri butiksoperatör. Pekare ger det nödvändiga stödet för dynamiskt minnesallokeringssystem i C ++.

Salesforce utvecklarhandledning för nybörjare

Med hjälp av Dynamic Allocation kan ett program få minne under körning.



De globala och lokala variablerna allokeras till minnet under kompileringstiden. Vi kan dock inte lägga till några globala eller lokala variabler under körning. Om programmet behöver använda en varierande mängd minne skulle vi behöva allokera minne under körning, efter behov. Och naturligtvis, här kan de dynamiska tilldelningsrutinerna tjäna syftet.

Skillnader mellan statisk minnestilldelning och dynamisk minnestilldelning:

Detta är en grundläggande minnesarkitektur som används för alla C ++ - program:

Memory - Dynamic Memory Allocation - Edureka

Vi behöver en sådan bild

Stapeln används för statisk minnestilldelning och Heap för dynamisk minnestilldelning, båda lagras i datorns RAM.

Variabler som tilldelas på stacken medan statisk minnestilldelning lagras direkt i minnet och åtkomst till detta minne är mycket snabb, dess allokering hanteras också när programmet kompileras. När en funktion eller en metod anropar en annan funktion som i sin tur kan ringa en annan funktion och så vidare, körs alla dessa funktioner till dess att den sista funktionen returnerar sitt värde. Stapeln lagras alltid i en LIFO-ordning (sist i först ut), det senast reserverade blocket är alltid nästa block som ska frigöras. Detta hjälper till att hålla reda på stacken, att frigöra ett block från stacken är inget annat än att justera en pekare.

Variabler som tilldelats på högen har sitt minne tilldelat vid körning medan dynamisk minnesallokering. Åtkomst till detta minne är lite långsammare jämfört med stacken, men storleken på högen begränsas bara av storleken på det virtuella minnet. Elementet på högen har inga beroenden med varandra och kan alltid nås slumpmässigt när som helst. Vi kan tilldela ett block när som helst och frigöra det när som helst. Detta gör det svårt att hålla reda på vilka delar av högen som tilldelas eller omplaceras vid varje given tidpunkt.

Fortsätter med den här artikeln om dynamisk minnesallokering i C ++

Tilldelning av minne med ny Nyckelord

I C ++ är ny operatören används för att allokera minne vid körning och minnet allokeras i byte. De ny operatör betecknar en begäran om dynamisk minnestilldelning på högen. Om tillräckligt med minne är tillgängligt kommer ny operatören initialiserar minnet och returnerar adressen till det nyligen allokerade och initialiserade minnet till pekervariabeln.

Syntax:

datatyp * pointer_name = ny datatyp

Exempel:

int * ptr = new int // Vi kan deklarera en variabel under dynamisk allokering på följande två sätt. int * ptr = new int (10) int * ptr = new int {15} // ny operator används också för att allokera ett block (en array) av minne av typen datatyp. int * ptr = new int [20] // Ovanstående uttalande allokerar dynamiskt minne för 20 heltal kontinuerligt av typen int och returnerar en pekare till det första elementet i sekvensen till 'ptr' -pekaren.

Notera : Om högen inte har tillräckligt med minne för att allokera, indikerar den nya begäran misslyckande genom att kasta ett undantag std :: bad_alloc, såvida inte 'nothrow' används med den nya operatören, i vilket fall den returnerar en NULL-pekare. Därför är det en bra praxis att söka efter pekvariabeln som produceras av new innan du använder den i programmet.

Fortsätter med den här artikeln om dynamisk minnesallokering i C ++

Fördelning av minne med hjälp av radera Nyckelord:

När heapminne tilldelas en variabel eller ett klassobjekt med hjälp av ny nyckelord kan vi hantera det minnesutrymmet med hjälp av radera nyckelord.

Syntax:

ta bort pointer_variable // Här är pointer_variable pekaren som pekar på dataobjektet som skapats av new. ta bort [] pointer_variable // För att frigöra det dynamiskt allokerade arrayminnet som pekas med pekervariabel använder vi följande form av delete:

Exempel:

ta bort ptr radera [] ptr

Notera : Objektets omfattning eller objektets livstid är den tid som objektet förblir i minnet under programkörningen. Heap Memory-allokering är långsammare än en stack, eftersom det i heap inte finns någon särskild ordning i vilken du kan fördela minne medan det i stacken följer LIFO.

Fortsätter med den här artikeln om dynamisk minnesallokering i C ++

Dynamiskt fördela arrayer

Den huvudsakliga användningen av begreppet dynamisk minnesallokering är för allokering av minne till en array när vi måste deklarera det genom att ange dess storlek men inte är säkra på det.

Låt oss se, ett exempel för att förstå dess användning.

#include genom att använda namespace std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * marks = new int [len] // Dynamisk minnesallokering<< 'Enter the marks of each student' << endl for( int i = 0 i>* (markerar + i)} för (int i = 0 i

Förklaring:
I det här exemplet ber vi först användaren om antalet elever i en klass och vi lagrar dess värde i len-variabeln. Då deklarerar vi en array med heltal och tilldelar det utrymme i minnet dynamiskt lika med värdet som är lagrat i len-variabeln med hjälp av detta uttalande int * marks = new int [längd], så det tilldelas ett utrymme lika med 'längd * (storlek 1 heltal)'. Resten av koden är självförklarande.

Fortsätter med den här artikeln om dynamisk minnesallokering i C ++

Dynamisk minnesallokering för objekt

Vi kan också allokera objekt dynamiskt.

Som vi vet att Constructor använde en speciell klassmedelsfunktion för att initiera ett objekt och Destructor är också en klassmedelsfunktion som kallas närhelst objektet går utanför räckvidden.

Destructor kan användas för att frigöra minnet som tilldelats objektet. Det kallas under följande förhållanden.

  • När ett lokalt objekt går utanför räckvidden
  • För ett globalt objekt, när en operatör appliceras på en pekare till klassens objekt

Vi kan återigen använda pekare medan vi dynamiskt fördelar minne till objekt.

Låt oss se ett exempel på en rad objekt.

#include using namespace 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 } 

Produktion:

Förklaring:

Konstruktören kommer att anropas tre gånger eftersom vi tilldelar minne till tre objekt i klassen Random. Destructor kommer också att anropas tre gånger under vart och ett av dessa objekt. 'Slumpmässig * a = ny slumpmässig [3]' detta uttalande är ansvarig för dynamisk minnesallokering av vårt objekt.

Således har vi kommit till slutet av den här artikeln om ”Dynamic Memory Allocation C ++”. Om du vill veta mer, kolla in av Edureka, ett pålitligt online-lärande företag. Edurekas Java J2EE- och SOA-utbildning och certifieringskurs är utformad för att träna dig för både grundläggande och avancerade Java-koncept tillsammans med olika Java-ramverk som Hibernate & Spring.

vad är en java böna

Har du en fråga till oss? Vänligen nämna det i kommentarsektionen på den här bloggen så kommer vi tillbaka till dig så snart som möjligt.