Was passiert, wenn malloc fehl schlägt?

Hallo liebe Community,

es geht um den Befehl „malloc()“ im ANSI-C Befehlssatz.

Es wird immer zu exception-handling bei malloc() geraten. Wie kann malloc eigentlich fehl schlagen? Nur durch RAM-überlauf? Und wenn malloc() fehl schlägt, muss man die Variable/den Speicherplatz dann immer noch mit free() befreien?

Es gab, glaube ich, eine ähnliche Funktion für das Erzeugen von Threads. Sicherlich gibt es auch noch mehr Beispiele, aber wie wird es generell gehandelt, wenn Ressourcen verwaltet werden sollen, dies aber aus irgendeinen Grund nicht möglich ist? Muss man die Ressourcen dann trotzdem wieder freigeben?

Habe bisher noch keine Antwort dazu gefunden.

Hi,

Es wird immer zu exception-handling bei malloc() geraten. Wie
kann malloc eigentlich fehl schlagen? Nur durch RAM-überlauf?

wenn die Speicherverwaltung den angeforderten Speicherbereich der Grösse n nicht mehr zur Verfuegung stellen kann, dann wird bei malloc(n) ein nullptr (0) zurueckgegeben.

Im embedded Bereich kann das schnell passieren …

Und wenn malloc() fehl schlägt, muss man die Variable/den
Speicherplatz dann immer noch mit free() befreien?

nein.

werden sollen, dies aber aus irgendeinen Grund nicht möglich
ist? Muss man die Ressourcen dann trotzdem wieder freigeben?

die Ressourcen, die man erfolgreich hat allokieren koennen, sollte man auch wieder freigeben.

Gruss
n.

Ergänzung
Hallo Fragewurm,

Wie
kann malloc eigentlich fehl schlagen? Nur durch RAM-überlauf?

Der angeforderte Speicherblock muss an einem Stück vorhanden sein.

Es kann also gesamthaft genügend freier Speicher im Heap vorhanden sein, aber so zerstückelt, dass die geforderte Blockgrösse nirgends dazwischen passt.
Nennt sich Fragmentierung.

Praktisch wirkt man der Fragmentierung in kleinste Stücke dadurch entgegen, dass malloc() immer Blöcke mit einer bestimmten Grösse, oder einem vielfachen davon, liefert.
Auf einem PC werden minimale Blockgrössen von um die 1 KiByte verwendet, auf MicroControllern sind Werte um 16 Byte üblich. Der optimale Wert hängt aber sehr von der Anwendung und den vorhandenen Ressourcen ab.

Die verwendete Blockgrösse ist unter Granularity zu finden und kann bei manchen Systemen auch verstellt werden.

Manche Programmiersprachen können in einem solchen Fall den Speicher defragmentieren (Garbage Collection). Dies bedingt aber eine aufwendigere, und langsamere, Speicherverwaltung.

MfG Peter(TOO)