Wie arbeite ich mit Dynamic Memory Allocation C ++?



In diesem Artikel wird die dynamische Speicherzuweisung in C ++ erläutert, eine wichtige Funktion, mit der Sie Ihren Speicherbedarf für Echtzeitressourcen berücksichtigen können.

Die dynamische Speicherzuweisung in C ++ ist eine sehr wichtige Funktion, mit der Sie Ihre Anforderungen berücksichtigen können, um den Bedarf an Echtzeitressourcen zu decken. In diesem Artikel würden wir untersuchen Erkundung im Detail. Die folgenden Hinweise werden in diesem Artikel behandelt:

Beginnen wir also mit diesem Artikel über die dynamische Speicherzuordnung in C ++





Benötigen Sie eine dynamische Speicherzuweisung?

Angenommen, wir möchten einen Satz als Array von Zeichen eingeben, sind uns jedoch nicht sicher, wie viele Zeichen genau im Array erforderlich sind.

stapeln und haufen in java

Wenn wir nun beim Deklarieren des Zeichenarrays dessen Größe kleiner als die Größe der gewünschten Zeichenfolge angeben, wird eine Fehlermeldung angezeigt, da der dem Array zugewiesene Speicherplatz im Speicher im Vergleich zur Größe der Eingabezeichenfolge geringer ist. Wenn wir angeben, dass seine Größe größer als die Größe der Eingabezeichenfolge ist, wird dem Array ein Speicherplatz zugewiesen, der viel größer als die Größe der gewünschten Zeichenfolge ist, wodurch unnötig mehr Speicher verbraucht wird, selbst wenn er nicht benötigt wird.



Im obigen Fall haben wir erst zur Kompilierungszeit (wenn der Computer den Code kompiliert und die Zeichenfolge vom Benutzer eingegeben wird) eine Vorstellung von der genauen Größe des Arrays. In solchen Fällen verwenden wir die Neu Operator.

C ++ definiert zwei unäre Operatoren Neu und löschen die die Aufgabe des Zuweisens und Freigebens von Speicher zur Laufzeit ausführen. Da diese Operatoren (neu und gelöscht) mit freiem Speicher (Heap-Speicher) arbeiten, werden sie auch als freier Speicheroperator bezeichnet. Zeiger bieten die erforderliche Unterstützung für ein dynamisches Speicherzuweisungssystem in C ++.

Mit Hilfe der dynamischen Zuordnung kann ein Programm zur Laufzeit Speicher abrufen.



Die globalen und lokalen Variablen werden während der Kompilierungszeit dem Speicher zugewiesen. Zur Laufzeit können jedoch keine globalen oder lokalen Variablen hinzugefügt werden. Wenn das Programm eine variable Speichermenge verwenden muss, müssen wir zur Laufzeit nach Bedarf Speicher zuweisen. Und natürlich können hier die dynamischen Zuordnungsroutinen den Zweck erfüllen.

Unterschiede zwischen statischer Speicherzuordnung und dynamischer Speicherzuordnung:

Dies ist eine grundlegende Speicherarchitektur, die für jedes C ++ - Programm verwendet wird:

Speicher - Dynamische Speicherzuordnung - Edureka

Wir brauchen ein Bild wie dieses

Der Stapel wird für die statische Speicherzuweisung und der Heap für die dynamische Speicherzuweisung verwendet. Beide werden im RAM des Computers gespeichert.

Variablen, die auf dem Stapel zugewiesen werden, während die statische Speicherzuweisung direkt im Speicher gespeichert wird und der Zugriff auf diesen Speicher sehr schnell erfolgt, wird auch beim Kompilieren des Programms behandelt. Wenn eine Funktion oder eine Methode eine andere Funktion aufruft, die wiederum eine andere Funktion usw. aufruft, bleibt die Ausführung all dieser Funktionen ausgesetzt, bis die allerletzte Funktion ihren Wert zurückgibt. Der Stapel wird immer in einer LIFO-Reihenfolge (last in first out) gespeichert. Der zuletzt reservierte Block ist immer der nächste freizugebende Block. Dies hilft, den Stapel im Auge zu behalten. Das Lösen eines Blocks vom Stapel ist nichts anderes als das Anpassen eines Zeigers.

Auf dem Heap zugewiesene Variablen haben ihren Speicher zur Laufzeit während der dynamischen Speicherzuweisung. Der Zugriff auf diesen Speicher ist im Vergleich zum Stapel etwas langsamer, aber die Größe des Heaps ist nur durch die Größe des virtuellen Speichers begrenzt. Das Element des Heaps hat keine Abhängigkeiten voneinander und kann jederzeit zufällig aufgerufen werden. Wir können einen Block jederzeit zuweisen und jederzeit freigeben. Dies macht es schwierig zu verfolgen, welche Teile des Heaps zu einem bestimmten Zeitpunkt zugewiesen oder freigegeben werden.

Fahren Sie mit diesem Artikel über die dynamische Speicherzuweisung in C ++ fort

Speicherzuweisung mit Neu Stichwort

In C ++ ist die Neu Der Operator wird verwendet, um zur Laufzeit Speicher zuzuweisen, und der Speicher wird in Bytes zugewiesen. Das Neu Der Operator bezeichnet eine Anforderung für die dynamische Speicherzuweisung auf dem Heap. Wenn genügend Speicher verfügbar ist, wird die Neu Der Operator initialisiert den Speicher und gibt die Adresse des neu zugewiesenen und initialisierten Speichers an die Zeigervariable zurück.

Syntax:

Datentyp * Zeigername = neuer Datentyp

Beispiel:

int * ptr = new int // Wir können eine Variable während der dynamischen Zuordnung auf die folgenden zwei Arten deklarieren. int * ptr = new int (10) int * ptr = new int {15} // Der neue Operator wird auch verwendet, um einen Speicherblock (ein Array) vom Typ Datentyp zuzuweisen. int * ptr = new int [20] // Die obige Anweisung reserviert dynamisch Speicher für 20 Ganzzahlen vom Typ int und gibt einen Zeiger auf das erste Element der Sequenz auf den Zeiger 'ptr' zurück.

Hinweis : Wenn der Heap nicht über genügend Speicher verfügt, um ihn zuzuweisen, zeigt die neue Anforderung einen Fehler an, indem eine Ausnahme std :: bad_alloc ausgelöst wird, es sei denn, mit dem neuen Operator wird 'nothrow' verwendet. In diesem Fall wird ein NULL-Zeiger zurückgegeben. Daher empfiehlt es sich, vor der Verwendung im Programm nach der von new erzeugten Zeigervariablen zu suchen.

Fahren Sie mit diesem Artikel über die dynamische Speicherzuweisung in C ++ fort

Freigabe des Speichers mit löschen Stichwort:

Sobald der Heapspeicher einer Variablen oder einem Klassenobjekt mit dem zugeordnet ist Neu Schlüsselwort, wir können diesen Speicherplatz mit dem freigeben löschen Stichwort.

Syntax:

delete pointer_variable // Hier ist pointer_variable der Zeiger, der auf das von new erstellte Datenobjekt zeigt. delete [] pointer_variable // Um ​​den dynamisch zugewiesenen Array-Speicher freizugeben, auf den die Zeigervariable zeigt, verwenden wir die folgende Form von delete:

Beispiel:

delete ptr delete [] ptr

Hinweis : Die Ausdehnung des Objekts oder die Lebensdauer des Objekts ist die Zeit, für die das Objekt während der Programmausführung im Speicher verbleibt. Die Zuweisung des Heap-Speichers ist langsamer als bei einem Stapel, da es im Heap keine bestimmte Reihenfolge gibt, in der Sie Speicher zuweisen können, während sie im Stapel LIFO folgt.

Fahren Sie mit diesem Artikel über die dynamische Speicherzuweisung in C ++ fort

Dynamisches Zuweisen von Arrays

Das Konzept der dynamischen Speicherzuweisung wird hauptsächlich zum Zuweisen von Speicher zu einem Array verwendet, wenn wir ihn durch Angabe seiner Größe deklarieren müssen, uns aber nicht sicher sind.

Sehen wir uns ein Beispiel an, um die Verwendung zu verstehen.

#include using namespace std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * markiert = new int [len] // Dynamische Speicherzuweisung cout<< 'Enter the marks of each student' << endl for( int i = 0 i>* (markiert + i)} für (int i = 0 i

Erläuterung:
In diesem Beispiel fragen wir zuerst den Benutzer nach der Anzahl der Schüler in einer Klasse und speichern ihren Wert in der Variablen len. Dann deklarieren wir ein Integer-Array und weisen ihm Speicherplatz im Speicher zu, der dynamisch dem Wert entspricht, der in der len-Variablen gespeichert ist, indem wir diese Anweisung verwenden. Int * markiert = new int [length], daher wird ihm ein Leerzeichen zugewiesen, das 'length * (Größe 1) entspricht ganze Zahl)'. Der Rest des Codes ist selbsterklärend.

Fahren Sie mit diesem Artikel über die dynamische Speicherzuweisung in C ++ fort

Dynamische Speicherzuordnung für Objekte

Wir können Objekte auch dynamisch zuordnen.

Wie wir wissen, ist Constructor eine spezielle Klassenelementfunktion, die zum Initialisieren eines Objekts verwendet wird, und Destructor ist auch eine Klassenelementfunktion, die aufgerufen wird, wenn das Objekt den Gültigkeitsbereich verlässt.

Mit Destructor kann der dem Objekt zugewiesene Speicher freigegeben werden. Es wird unter den folgenden Bedingungen aufgerufen.

  • Wenn ein lokales Objekt den Gültigkeitsbereich verlässt
  • Für ein globales Objekt, wenn ein Operator auf einen Zeiger auf das Objekt der Klasse angewendet wird

Wir können wieder Zeiger verwenden, während wir Objekten dynamisch Speicher zuweisen.

Sehen wir uns ein Beispiel für ein Array von Objekten an.

#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 } 

Ausgabe:

wie man Kräfte in Java benutzt

Erläuterung:

Der Konstruktor wird dreimal aufgerufen, da wir drei Objekten der Klasse Random Speicher zuweisen. Der Destruktor wird während jedes dieser Objekte auch dreimal aufgerufen. 'Random * a = new Random [3]' Diese Anweisung ist für die dynamische Speicherzuweisung unseres Objekts verantwortlich.

Damit sind wir am Ende dieses Artikels über 'Dynamic Memory Allocation C ++' angelangt. Wenn Sie mehr erfahren möchten, lesen Sie die von Edureka, einem vertrauenswürdigen Online-Lernunternehmen. Der Java J2EE- und SOA-Schulungs- und Zertifizierungskurs von Edureka wurde entwickelt, um Sie sowohl für Kern- als auch für fortgeschrittene Java-Konzepte sowie für verschiedene Java-Frameworks wie Hibernate & Spring zu schulen.

Hast du eine Frage an uns? Bitte erwähne es im Kommentarbereich dieses Blogs und wir werden uns so schnell wie möglich bei dir melden.