In C kann der Speicher für Variablen entweder im Stack oder im Heap zugewiesen werden.
malloc, calloc, realloc zu und muss manuell über free freigegeben werden. Der Speicherumfang wird von den Möglichkeiten des Systems bestimmt, der Zugriff ist jedoch langsamer und die Freigabe muss manuell kontrolliert werden.Wann den Stack verwenden:
Wann den Heap verwenden:
// Im Stack int arr[10]; // Im Heap int* parr = malloc(sizeof(int) * 10); // Vergessen Sie nicht, den Speicher freizugeben free(parr);
Frage: Was passiert, wenn für ein Array, das über malloc zugewiesen wurde, die Funktion free nicht aufgerufen wird?
Antwort: Es tritt ein Speicherverlust (memory leak) auf. Dynamisch zugewiesener Speicher wird nicht automatisch freigegeben, und im Laufe der Zeit kann dies zu einem erschöpften Speicher des Programms oder des gesamten Systems führen.
void leak() { int* leakArr = malloc(100 * sizeof(int)); // Kein Aufruf von free(leakArr), Speicher geht verloren }
Geschichte
In einem Projekt haben Programmierer Speicher für eine Struktur, die eine Benutzersitzung beschreibt, über malloc zugewiesen, aber vergessen, free am Ende der Sitzung aufzurufen. Infolgedessen verlor das Projekt über mehrere Tage Speicher, der Server „stürzte“ mit einem Speichermangel-Fehler ab. Das Problem wurde erst nach dem Profilieren mit Valgrind und der Behebung aller versäumten free-Aufrufe gelöst.
Geschichte
Ein Entwickler hat ein großes Array (bis zu 10 MB) im Stack für temporäre Berechnungen zugewiesen. Auf einem Server mit geringem Stackumfang führte dies zu einem Absturz der Anwendung mit einem Stack-Overflow-Fehler. Nach einer Analyse musste der Puffer in den Heap übertragen werden.
Geschichte
Einer der Entwickler beschloss, lange Strings im Stack zu speichern, aber die Länge des Strings wurde subjektiv vom Benutzer vorgegeben. Bei der Eingabe eines sehr langen Strings stürzte die Anwendung mit einem Zugriffsfehler ab. Schließlich wurde die Entscheidung getroffen, die eingegebenen Daten in den Heap mit Längenprüfungen zu übertragen.