Freigeben und Leaks vermeiden
Räumen Sie korrekt auf.
Freigeben und Leaks vermeiden ist eine kostenlose C Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.
Jedes malloc benötigt ein free
Heap-Speicher bleibt reserviert, bis Sie ihn mit free freigeben. Wenn Sie den einzigen Pointer auf einen Block verlieren, ohne ihn freizugeben, entsteht ein Speicherleck.
Leaks summieren sich mit der Zeit und können in langlebigen Programmen den gesamten verfügbaren Speicher aufbrauchen.
int *a = malloc(100 * sizeof(*a));
/* ... use a ... */
free(a);Was free tatsächlich bewirkt
free(p) gibt den Block an den Allocator zurück, damit er wiederverwendet werden kann. Der Wert von p selbst wird dadurch nicht geändert.
Nach free zeigt p weiterhin auf die alte Adresse, die nun ungültig ist. Ein Zugriff darauf führt zu undefiniertem Verhalten.
free(p);
/* p is now a dangling pointer */Die Falle des Dangling Pointers
Ein Pointer, der nach dem Freigeben verwendet wird, verursacht einen Use-after-free-Fehler. Das kann zunächst zu funktionieren scheinen und dann Daten beschädigen oder unvorhersehbar abstürzen.
Eine einfache Schutzmaßnahme besteht darin, den Pointer direkt nach dem Freigeben auf NULL zu setzen.
free(a);
a = NULL; /* now misuse is a clean NULL deref, easier to catch */Double Free ist undefiniertes Verhalten
Wenn free zweimal für denselben Block aufgerufen wird, wird der interne Zustand des Allocators beschädigt, und das Programm stürzt häufig ab.
Den Pointer nach dem ersten Freigeben auf NULL zu setzen, hilft, da free(NULL) ausdrücklich sicher ist und nichts bewirkt.
free(a);
a = NULL;
free(a); /* free(NULL) is a harmless no-op */Geben Sie nur Speicher frei, den Sie mit malloc reserviert haben
Übergeben Sie free ausschließlich einen Pointer, der von malloc, calloc oder realloc zurückgegeben wurde.
Die Adresse einer Stack-Variable, ein Stringliteral oder ein Pointer in die Mitte eines Blocks freizugeben, führt zu undefiniertem Verhalten.
int x = 5;
/* free(&x); WRONG: x is on the stack */
int *p = malloc(sizeof(int));
free(p); /* correct */Leak durch eine vorzeitige Rückgabe
Ein häufiges Leck entsteht, wenn Sie Speicher reservieren und anschließend einen Fehlerpfad erreichen, der vor dem Freigeben zurückkehrt. Der Block geht dadurch verloren.
Stellen Sie sicher, dass jeder Ausgangspfad, der für den Speicher verantwortlich ist, ihn zuvor freigibt.
int *a = malloc(n * sizeof(*a));
if (something_failed) {
free(a); /* don't forget this before returning */
return -1;
}Ein sauberes Programm zum Reservieren und Freigeben
Dieses Programm reserviert, verwendet und gibt Speicher auf jedem Pfad frei und verursacht keine Leaks.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 4;
int *a = malloc(n * sizeof(*a));
if (!a) return 1;
for (int i = 0; i < n; i++) a[i] = i + 1;
int sum = 0;
for (int i = 0; i < n; i++) sum += a[i];
printf("%d\n", sum);
free(a);
a = NULL;
return 0;
}Verschachtelte Allokationen freigeben
Wenn ein Block Pointer auf andere Blöcke enthält, geben Sie zuerst die inneren und anschließend den äußeren Block frei.
Würden Sie den äußeren Block zuerst freigeben, gingen die Adressen der inneren Blöcke verloren und diese würden zu Leaks.
for (size_t i = 0; i < rows; i++)
free(grid[i]); /* free each row first */
free(grid); /* then the array of pointers */Ein Besitzer pro Block
Legen Sie fest, welcher Teil Ihres Codes jede Allokation besitzt und für ihre Freigabe verantwortlich ist.
Wenn zwei Pointer auf denselben Block verweisen und ihn beide freigeben, entsteht ein Double Free. Eindeutige Besitzverhältnisse verhindern das.
Leaks mit Tools erkennen
Sie müssen Leaks nicht mit bloßem Auge suchen. Tools wie valgrind oder AddressSanitizer melden Leaks und ungültige Freigaben zusammen mit den Zeilennummern.
Kompilieren Sie mit -g und führen Sie das Programm unter dem Tool aus, um genau zu sehen, was nicht freigegeben wurde.
/* gcc -g -fsanitize=address prog.c && ./a.out */
/* or: valgrind --leak-check=full ./a.out */In umgekehrter Reihenfolge der Einrichtung freigeben
Eine zuverlässige Gewohnheit: Wenn eine Funktion mehrere Ressourcen erwirbt, geben Sie sie in umgekehrter Reihenfolge wieder frei.
Das entspricht dem Aufbau der Abhängigkeiten und sorgt für eine vorhersehbare Bereinigung.
char *buf = malloc(64);
int *idx = malloc(64 * sizeof(int));
/* ... use them ... */
free(idx); /* free last-acquired first */
free(buf);Kurzer Test
Testen Sie Ihr Verständnis der Speicherfreigabe.
Zusammenfassung
Ordnen Sie jeder Allokation auf jedem Codepfad genau ein free zu.
Vermeiden Sie Dangling Pointer und Double Frees, indem Sie Pointer nach dem Freigeben auf NULL setzen. Geben Sie verschachtelte Allokationen von innen nach außen frei, legen Sie für jeden Block einen Besitzer fest und verwenden Sie valgrind oder ASan, um Leaks zu erkennen. Damit verfügen Sie nun über das vollständige Werkzeugset für dynamische Arrays.
Häufig gestellte Fragen
Ist die Lektion „Freigeben und Leaks vermeiden“ kostenlos?
Ja — der vollständige Text von „Freigeben und Leaks vermeiden“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Freigeben und Leaks vermeiden“?
Räumen Sie korrekt auf. Du übst C Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C Academy zu starten?
Keine Vorkenntnisse erforderlich. C Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Freigeben und Leaks vermeiden“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C Academy-Lektion Code schreiben und ausführen?
Ja. Jede C Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Ein Array allozieren
- Mit realloc vergrößern
- Ein wiederverwendbarer Vektortyp
- Freigeben und Leaks vermeiden