Es gibt zwei Stellen, an denen Variablen gespeichert werden können. Wenn Sie eine Variable wie folgt erstellen:
int a;
char c;
char d[16];
Die Variablen werden im " Stack " erstellt. Stapelvariablen werden automatisch freigegeben, wenn sie den Gültigkeitsbereich verlassen (dh wenn der Code sie nicht mehr erreichen kann). Sie könnten sie als "automatische" Variablen bezeichnen, aber das ist aus der Mode gekommen.
Viele Anfängerbeispiele verwenden nur Stapelvariablen.
Der Stapel ist schön, weil er automatisch ist, hat aber auch zwei Nachteile: (1) Der Compiler muss im Voraus wissen, wie groß die Variablen sind, und (b) der Stapelspeicher ist etwas begrenzt. Beispiel: In Windows ist der Stapel unter den Standardeinstellungen für den Microsoft-Linker auf 1 MB festgelegt, und nicht alles ist für Ihre Variablen verfügbar.
Wenn Sie zur Kompilierungszeit nicht wissen, wie groß Ihr Array ist, oder wenn Sie ein großes Array oder eine große Struktur benötigen, benötigen Sie "Plan B".
Plan B heißt " Haufen ". Normalerweise können Sie Variablen erstellen, die so groß sind, wie es das Betriebssystem zulässt, aber Sie müssen dies selbst tun. Frühere Beiträge haben Ihnen gezeigt, wie Sie dies tun können, obwohl es auch andere Möglichkeiten gibt:
int size;
// ...
// Set size to some value, based on information available at run-time. Then:
// ...
char *p = (char *)malloc(size);
(Beachten Sie, dass Variablen im Heap nicht direkt, sondern über Zeiger bearbeitet werden.)
Sobald Sie eine Heap-Variable erstellt haben, besteht das Problem darin, dass der Compiler nicht erkennen kann, wann Sie damit fertig sind, sodass Sie die automatische Freigabe verlieren. Hier kommt die "manuelle Freigabe" ins Spiel, auf die Sie sich bezogen haben. Ihr Code ist nun dafür verantwortlich, zu entscheiden, wann die Variable nicht mehr benötigt wird, und sie freizugeben, damit der Speicher für andere Zwecke verwendet werden kann. Für den obigen Fall mit:
free(p);
Was diese zweite Option zu einem "bösen Geschäft" macht, ist, dass es nicht immer einfach ist zu wissen, wann die Variable nicht mehr benötigt wird. Wenn Sie vergessen, eine Variable freizugeben, wenn Sie sie nicht benötigen, belegt Ihr Programm mehr Speicher, als es benötigt. Diese Situation wird als "Leck" bezeichnet. Der "durchgesickerte" Speicher kann für nichts verwendet werden, bis Ihr Programm endet und das Betriebssystem alle seine Ressourcen wiederherstellt. Noch schlimmere Probleme sind möglich, wenn Sie versehentlich eine Heap-Variable freigeben, bevor Sie tatsächlich damit fertig sind.
In C und C ++ sind Sie dafür verantwortlich, Ihre Heap-Variablen wie oben gezeigt zu bereinigen. Es gibt jedoch Sprachen und Umgebungen wie Java- und .NET-Sprachen wie C #, die einen anderen Ansatz verwenden, bei dem der Heap selbst bereinigt wird. Diese zweite Methode, die als "Garbage Collection" bezeichnet wird, ist für den Entwickler viel einfacher, aber Sie zahlen eine Strafe für Overhead und Leistung. Es ist ein Gleichgewicht.
(Ich habe viele Details beschönigt, um eine einfachere, aber hoffentlich ebenere Antwort zu geben.)