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
 3int 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.)