C++-Programmierung/ Speicherverwaltung/ Array-new und Array-delete

Aus Wikibooks
Zur Navigation springen Zur Suche springen


Besonders nützlich ist diese Art, Speicher zu reservieren, beim Erstellen dynamischer Datenfelder (engl. arrays) oder bei Listen - denn deren Umfang/Länge ergibt sich häufig erst während des Programmlaufs. Hierzu wird nach der Angabe des Datentyps die Anzahl als int angegeben:

Crystal Project Tutorials.png
Syntax:
new «Datentyp»[«Menge»];
«Nicht-C++-Code», »optional«

Das Freigeben des Speichers, wenn die Daten nicht mehr benötigt werden, funktioniert für einfache Datenfelder ähnlich wie für einzelne Variablen mit delete[].

Dies kann im Code zum Beispiel so aussehen:

Nuvola-inspired-terminal.svg
 1 #include <iostream>
 2 
 3 int main(){
 4     int *dyn_array = 0;
 5     int groesse;
 6 
 7     std::cout  << "Wie gross soll das Datenfeld werden?" << std::endl;
 8     std::cin >> groesse;
 9     dyn_array = new int[groesse];            // Anfordern eines Datenfeld aus int-Werten
10 
11     for (int i = 0; i < groesse; ++i){
12         dyn_array[i] = i;                    // Wiederholung aus Kapitel "Zeigerarithmetik":
13                                              //  dyn_array[i] entspricht *(dyn_array + i)
14     }
15 
16     for (int i = 0; i < groesse; ++i){
17         std::cout << dyn_array[i] << std::endl;
18     }
19 
20     delete[] dyn_array;                      // Das Freigeben des Speichers funktioniert 
21                                              // wie für einzelne Werte
22     dyn_array = 0;                           // Pointer definiert auf Null zeigen lassen
23 }

Erwähnenswert ist an dieser Stelle noch, dass sich Arrays beim Anlegen nicht initialisieren lassen. Man kann aber natürlich, wie im Beispiel, nach dem Anlegen das gesamte Array mit Werten belegen, beispielsweise mit einer for-Schleife.

Weiterhin ist zu beachten, dass (bei mehrdimensionalen Arrays) nur die erste Dimension dynamisch erzeugt werden kann. Für weitere Dimensionen können nur Konstanten eingesetzt werden. (Allerdings kann man mit Kniffen jedes mehrdimensionale Array als eindimensionales mit entsprechendem Zugriff darstellen.)