Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> C Sprache

Dynamischer C++-Speicher

Ein gutes Verständnis dafür, wie dynamischer Speicher in C++ wirklich funktioniert, ist unerlässlich, um ein guter C++-Programmierer zu werden. Der Speicher in Ihrem C++-Programm ist in zwei Teile unterteilt −

Oft wissen Sie im Voraus nicht, wie viel Speicher Sie benötigen, um bestimmte Informationen in einer definierten Variablen zu speichern, und die Größe des erforderlichen Speichers kann zur Laufzeit bestimmt werden.

Sie können zur Laufzeit im Heap Speicher für die Variable eines bestimmten Typs zuweisen, indem Sie einen speziellen Operator in C++ verwenden, der die Adresse des zugewiesenen Speicherplatzes zurückgibt. Dieser Operator heißt new Betreiber.

Wenn Sie keinen dynamisch zugewiesenen Speicher mehr benötigen, können Sie delete verwenden -Operator, der Speicher freigibt, der zuvor vom neuen Operator zugewiesen wurde.

Operatoren neu und löschen

Es gibt folgende generische Syntax zur Verwendung von new Operator, um Speicher für jeden Datentyp dynamisch zuzuweisen.

new data-type;

Hier Datentyp könnte jeder eingebaute Datentyp sein, einschließlich eines Arrays, oder jeder benutzerdefinierte Datentyp, einschließlich Klasse oder Struktur. Beginnen wir mit den eingebauten Datentypen. Beispielsweise können wir einen Zeiger auf den Typ double definieren und dann anfordern, dass der Speicher zur Ausführungszeit zugewiesen wird. Wir können dies mit dem neuen tun Operator mit den folgenden Anweisungen −

double* pvalue  = NULL; // Pointer initialized with null
pvalue  = new double;   // Request memory for the variable

Der Speicher wurde möglicherweise nicht erfolgreich zugewiesen, wenn der freie Speicherplatz aufgebraucht war. Es empfiehlt sich daher, zu prüfen, ob der neue Operator einen NULL-Zeiger zurückgibt, und die entsprechenden Maßnahmen wie unten zu ergreifen −

double* pvalue  = NULL;
if( !(pvalue  = new double )) {
   cout << "Error: out of memory." <<endl;
   exit(1);
}

Das malloc() Funktion aus C, existiert immer noch in C++, aber es wird empfohlen, die Funktion malloc() zu vermeiden. Der Hauptvorteil von new gegenüber malloc() besteht darin, dass new nicht nur Speicher zuweist, sondern Objekte konstruiert, was der Hauptzweck von C++ ist.

Wenn Sie das Gefühl haben, dass eine dynamisch zugewiesene Variable nicht mehr benötigt wird, können Sie den von ihr belegten Speicherplatz jederzeit mit dem „Löschen“-Operator wie folgt im freien Speicher freigeben −

delete pvalue;        // Release memory pointed to by pvalue

Lassen Sie uns die obigen Konzepte zusammenfassen und das folgende Beispiel bilden, um zu zeigen, wie „new“ und „delete“ funktionieren −

Live-Demo
#include <iostream>
using namespace std;

int main () {
   double* pvalue  = NULL; // Pointer initialized with null
   pvalue  = new double;   // Request memory for the variable
 
   *pvalue = 29494.99;     // Store value at allocated address
   cout << "Value of pvalue : " << *pvalue << endl;

   delete pvalue;         // free up the memory.

   return 0;
}

Wenn wir den obigen Code kompilieren und ausführen, würde dies das folgende Ergebnis erzeugen −

Value of pvalue : 29495

Dynamische Speicherzuweisung für Arrays

Stellen Sie sich vor, Sie möchten Speicher für ein Array von Zeichen zuweisen, dh eine Zeichenfolge mit 20 Zeichen. Mit der gleichen Syntax, die wir oben verwendet haben, können wir Speicher wie unten gezeigt dynamisch zuweisen.

char* pvalue  = NULL;         // Pointer initialized with null
pvalue  = new char[20];       // Request memory for the variable

Um das soeben erstellte Array zu entfernen, würde die Anweisung wie folgt aussehen −

delete [] pvalue;             // Delete array pointed to by pvalue

Nach der ähnlichen generischen Syntax des new-Operators können Sie für ein mehrdimensionales Array wie folgt zuweisen −

double** pvalue  = NULL;      // Pointer initialized with null 
pvalue  = new double [3][4];  // Allocate memory for a 3x4 array 

Die Syntax zum Freigeben des Speichers für mehrdimensionale Arrays bleibt jedoch dieselbe wie oben −

delete [] pvalue;            // Delete array pointed to by pvalue

Dynamische Speicherzuweisung für Objekte

Objekte unterscheiden sich nicht von einfachen Datentypen. Betrachten Sie zum Beispiel den folgenden Code, in dem wir ein Array von Objekten verwenden, um das Konzept zu verdeutlichen −

Live-Demo
#include <iostream>
using namespace std;

class Box {
   public:
      Box() { 
         cout << "Constructor called!" <<endl; 
      }
      ~Box() { 
         cout << "Destructor called!" <<endl; 
      }
};
int main() {
   Box* myBoxArray = new Box[4];
   delete [] myBoxArray; // Delete array

   return 0;
}

Wenn Sie ein Array von vier Box-Objekten zuweisen würden, würde der einfache Konstruktor viermal aufgerufen werden, und ebenso wird der Destruktor beim Löschen dieser Objekte ebenso oft aufgerufen.

Wenn wir den obigen Code kompilieren und ausführen, würde dies das folgende Ergebnis erzeugen −

Constructor called!
Constructor called!
Constructor called!
Constructor called!
Destructor called!
Destructor called!
Destructor called!
Destructor called!

C Sprache

  1. C++-Datentypen
  2. C++-Operatoren
  3. C++-Kommentare
  4. C - Speicherverwaltung
  5. C++-Übersicht
  6. C++ Konstanten/Literale
  7. Operatoren in C++
  8. Zahlen in C++
  9. C++-Referenzen
  10. Dynamischer C++-Speicher