In der Programmiersprache C werden Funktionen aus der Bibliothek stdlib.h für die dynamische Speicherverwaltung verwendet:
malloc(size_t size) — weist einen Speicherblock der angegebenen Größe zu. Der Speicher ist nicht initialisiert.calloc(size_t nmemb, size_t size) — weist einen Speicherblock für ein Array von nmemb Elementen der angegebenen Größe zu und initialisiert ihn mit Nullen.realloc(void *ptr, size_t size) — ändert die Größe eines zuvor zugewiesenen Speicherblocks.free(void *ptr) — gibt den zuvor zugewiesenen Block frei.Beispiel für die Verwendung:
int *arr = (int *)malloc(10 * sizeof(int)); if (arr == NULL) { // Fehlerbehandlung für Speicherzuweisung } // ... Arbeiten mit arr ... free(arr);
Es ist wichtig, immer das Ergebnis der Speicherzuweisung auf NULL zu überprüfen und free aufzurufen, um Speicherlecks zu vermeiden.
Was wird das Ergebnis des folgenden Codes sein?
int *arr = malloc(sizeof(int) * 5); free(arr); free(arr);
Antwort: Ein wiederholter Aufruf von free für denselben Speicherbereich führt zu undefiniertem Verhalten. Man kann denselben Zeiger nur einmal freigeben.
Geschichte
In einem Projekt zur Automatisierung von Tests gab es regelmäßige Abstürze. Der Schuldige war ein Systemzyklus, in dem nach jedem Durchlauf vergessen wurde, den über
malloczugewiesenen Speicher freizugeben. Infolgedessen hat das System bei langen Tests den gesamten Arbeitsspeicher "aufgebraucht" und ist abgestürzt.
Geschichte
Die Implementierung eines dynamischen Arrays verwendete
realloc, ohne das Rückgaberesultat zu überprüfen. Bei einem Fehlschlag (realloc gab NULL zurück) wurde der Zeiger auf den alten Speicher verloren, was zu einem Speicherleak führte. Ein nachfolgender Versuch, mit dem Speicher zu arbeiten, führte zu einem Segfault.
Geschichte
Einem Entwickler wurde aufgetragen, ein veraltetes C-Modul zu integrieren, bei dem der Speicher über
freezweimal hintereinander mit demselben Zeiger freigegeben wurde. Auf den meisten Betriebssystemen traten keine Fehler auf, aber auf einer neuen Plattform stürzte die Anwendung ab; die Ursache wurde erst nach langer Zeit entdeckt: Double-Free.