Speicher freigeben mit free()
Teil des Abschnitts Logic & Flow der C-Journey von Coddy — Lektion 35 von 63.
Wenn Sie Speicher dynamisch mit malloc() reservieren, bleibt dieser Speicher reserviert, bis Sie ihn explizit freigeben. Die Funktion free() ist Ihr Werkzeug, um dynamisch reservierten Speicher an das System zurückzugeben, wenn Sie ihn nicht mehr benötigen.
Die Funktion free() nimmt ein Argument entgegen: einen Zeiger auf den Speicherblock, den Sie freigeben möchten. Dies muss derselbe Zeiger sein, der von malloc() (oder verwandten Funktionen wie calloc()) zurückgegeben wurde.
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Speicher reservieren
*ptr = 42; // Den Speicher verwenden
free(ptr); // Den Speicher freigeben, wenn fertigDas Versäumnis, free() aufzurufen, erzeugt ein sogenanntes Speicherleck. Der zugewiesene Speicher bleibt von Ihrem Programm reserviert, obwohl Sie ihn nicht mehr verwenden. In lang laufenden Programmen oder Programmen, die wiederholt Speicher zuweisen, können diese Lecks den gesamten verfügbaren Systemspeicher verbrauchen und Performance-Probleme oder Abstürze verursachen.
Denken Sie daran: Jedes malloc() sollte ein entsprechendes free() haben. Diese Paarung ist für eine verantwortungsvolle Speicherverwaltung in der C-Programmierung unerlässlich.
Aufgabe
EinfachSchreiben Sie ein C-Programm, das den vollständigen Lebenszyklus der dynamischen Speicherallokation und -freigabe demonstriert. Ihr Programm sollte:
- Einen Ganzzahlwert
countvom Benutzer einlesen, der angibt, wie viele Ganzzahlen gespeichert werden sollen malloc()zusammen mitsizeof()verwenden, um dynamisch Speicher für ein Array voncountGanzzahlen zu reservieren- Überprüfen, ob die Speicherallokation erfolgreich war – falls sie fehlschlägt, geben Sie
Memory allocation failed!aus und beenden Sie das Programm - Wenn die Allokation erfolgreich ist, geben Sie
Memory allocated successfully!aus countGanzzahlwerte vom Benutzer einlesen und im reservierten Array speichern- Die Summe aller Werte berechnen und im Format
Sum: [value]ausgeben - Den Maximalwert finden und im Format
Maximum: [value]ausgeben free()verwenden, um den Speicher wieder freizugebenMemory freed successfully!ausgeben, um die Bereinigung zu bestätigen
Denken Sie daran, den Header <stdlib.h> einzubinden, um malloc() und free() verwenden zu können. Diese Herausforderung demonstriert die essenzielle Paarung von malloc() und free(), um Speicherlecks in Ihren Programmen zu vermeiden.
Wenn die Eingabe zum Beispiel wie folgt aussieht:
4
15 8 23 12Sollte Ihre Ausgabe wie folgt aussehen:
Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!Diese Herausforderung verdeutlicht das kritische Konzept, dass jeder dynamisch reservierte Speicherblock ordnungsgemäß freigegeben werden muss, wenn er nicht mehr benötigt wird, wodurch der verantwortungsvolle Zyklus der Speicherverwaltung in der C-Programmierung abgeschlossen wird.
Spickzettel
Verwenden Sie free(), um Speicher freizugeben, der mit malloc() reserviert wurde:
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Speicher reservieren
*ptr = 42; // Den Speicher verwenden
free(ptr); // Den Speicher freigeben, wenn er nicht mehr benötigt wirdJedes malloc() sollte ein entsprechendes free() haben, um Speicherlecks zu verhindern. Der an free() übergebene Pointer muss derselbe Pointer sein, der von malloc() zurückgegeben wurde.
Probier es selbst
#include <stdio.h>
#include <stdlib.h>
int main() {
int count;
// Lies die Anzahl der zu speichernden Ganzzahlen ein
scanf("%d", &count);
// TODO: Schreibe deinen Code unten
// 1. Speicher mit malloc() und sizeof() reservieren
// 2. Überprüfen, ob die Reservierung erfolgreich war
// 3. Die Ganzzahlwerte einlesen und speichern
// 4. Summe berechnen und das Maximum finden
// 5. Den reservierten Speicher freigeben
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
1Zeiger-Grundlagen
Was ist ein Zeiger?Zeiger deklarierenDer Adressoperator (&)Der Dereferenzierungsoperator (*)NULL-ZeigerZusammenfassung: Zeiger-Grundlagen4Projekt: Einfaches Text-Tool
ProjektübersichtZeichen zählen2Pointer und Arrays
Array-Namen als PointerArray-Elemente - PointerPointer-ArithmetikPointer vergleichenWiederholung: Array-Durchlauf mit Pointern5Zeiger und Funktionen
Wertübergabe (Pass-by-Value)Zeiger an Funktionen übergebenVariablen über Zeiger ändernEin klassisches Beispiel: SwapArrays an Funktionen übergebenZusammenfassung: Zeiger als Funktionsargumente8Structs und Zeiger
Zeiger auf StructsDer Pfeiloperator (->)Structs per Wert übergebenÜbergabe von Struct-ZeigernDynamische Allokation von StructsZusammenfassung: Struct ändern - Ptr11Finale Wiederholungsaufgaben
Wiederholung: Dynamische String-KonkatenationWiederholung: Array von StructsWiederholung: Wortfrequenz-Zähler3Character-Arrays und Strings
Strings als char-ArraysDer Null-TerminatorString-Eingabe mit scanfVerwendung von strlen()Verwendung von strcpy()Verwendung von strcat()Verwendung von strcmp()Zusammenfassung: Grundlegende String-Funktionen6Speicherverwaltung
Stack vs. Heap SpeicherDynamische Allokation - malloc()Verwendung von sizeof() für die AllokationÜberprüfung auf AllokationsfehlerSpeicher freigeben mit free()Allokation mit calloc()Rückblick: Dynamische Arrays