Bisher wurden ausschließlich Variablen angelegt, deren Speicherbedarf zur Übersetzungszeit fest steht.
Wenn Sie beispielsweise ein Array benötigen, deren Länge (Anzahl an Elementen) sich erst zur Laufzeit des Programms ergibt, dann können Sie ein passendes Array in einer Compilersprache wie C/C++ nur dynamisch anlegen lassen. Hierzu wird eine Betriebssystemfunktion zur Speicherallokation aufgerufen. Diese Speicherallokation erfolgt in C und C++ in unterschiedlicher Weise.
In jedem Falle ist ein reservierter Speicherbereich zur Programmlaufzeit auch wieder freizugeben, damit er während einer Sitzung wieder verwendet werden kann. Andernfalls verringert sich der zur Verfügung stehende Speicherbereich sukzessive.
Zwecks Speicherallokation stehen folgende Funktionen zur Verfügung:
malloc() - von memory allocation
calloc() - von count (memory) allocation
Hilfreich bzw. unabdingbar ist dazu die Verwendung der Funktion sizeof(), die den benötigten Speicherumfang einer Variablen bzw. eines Typs liefert.
Die Freigabe erfolgt mit dem Aufruf der Funktion free().
Zur Speicherallokation können zunächst die C-Funktionen verwendet werden.
Zusätzlich stehen vier hilfreiche Operatoren zur Verfügung.
new
sorgt für die Reservierung des Speichers (Allokation) für eine einzelne Variable
und zwar ohne den Bedarf von sizeof()
.
Form des Aufrufs:
Variablentyp* Zeiger;
Zeiger = new Variablentyp;
delete
gibt den Speicher frei, auf den der Zeigeroperand zeigt.
Form des Aufrufs:
delete Zeiger;
new[]
allokiert Speicher für ein Datenfeld (Array).
Form des Aufrufs:
Elementetyp* Feldname;
Feldname = new Feldtyp[Elementeanzahl];
delete[]
gibt den Speicher frei, auf den die Feldvariable zeigt.
Form des Aufrufs:
delete[]
Feldname;
Wichtig!
Sie dürfen die Möglichkeiten nicht mischen.
Ein mit malloc()
allokierter Speicher ist mit free()
wieder freizugeben
und nicht etwa mit delete
.
Ein mit new
allokierter Speicher ist mit delete wieder freizugeben und nicht etwa mit
free()
.
Ein mit new[]
allokierter Speicher ist mit delete[]
wieder freizugeben
und nicht mit delete
.
Bei der Freigabe ist darauf zu achten, dass ein Speicherbereich nicht mehrfach freigegeben wird.