Speichermanagement - Garbage Collector
-
Hi, besitzt ANSI C keinen Garbage Collector ? Mir ist jedenfalls aufgefallen das wenn ich Prozeduren meines soeben ersten in C geschriebenen Programmes aufrufe der benötige Speicher hochgeht und oben bleibt, dabei sind die Variablen alle nur lokal definiert und müssten ( so kenne ich von java ) doch aufgeräumt werden sobald die Prozedur beendet ist.
Oder muss ich das manuell machen ? Falls ja wie gebe ich den Speicher einer Variable die nicht mehr benötigt wird wieder frei ?TIA
mfg Copper Hobbit
-
C hat keinen GC.
Beendete Funktionen räumen ihren Speicher wieder vom Stack, wenn du das meinst.
Wenn dein Speicherverbrauch hochgeht, dann würde ich dir raten, mal den Speicher, den du mit malloc()/realloc() holst, auch wieder zu free()n.
Gib Beispielcode!
-
c°h° schrieb:
Hi, besitzt ANSI C keinen Garbage Collector ?
Nun, letztendlich ist das die Angelegenheit der Implementation. Ich kenne jedoch keinen Compiler, der lokale Variablen mit GC managed. In C++ übrigens auch nicht. Und das ist auch gut so.
c°h° schrieb:
Mir ist jedenfalls aufgefallen das wenn ich Prozeduren meines soeben ersten in C geschriebenen Programmes aufrufe der benötige Speicher hochgeht und oben bleibt, dabei sind die Variablen alle nur lokal definiert und müssten ( so kenne ich von java ) doch aufgeräumt werden sobald die Prozedur beendet ist.
Sofern es sich um statischen oder automatischen Speicher handelt, wird auch automatisch aufgeräumt. Du musst lediglich dynamischen Speicher manuell freigeben.
-
c°h° schrieb:
...( so kenne ich von java )..
Wieder ein Beispiel, warum die Leute niemals mit Java anfangen sollten, weil das die Programmierer werden, die immer vergessen ihren "Muell" wieder aus dem Speicher zu entfernen.
Aber um auch was Produktives zu bringen: [cpp]int myFunc( int n )
{
char array1[n]; // Muss nicht geloescht werden, da es auf dem stack angelegt wird
char *array2 = malloc( n, sizeof(char) ); //Muss irgendwann mit free( array2 ) freigegeben werden, da es auf dem heap liegt
}
-
pli schrieb:
Wieder ein Beispiel, warum die Leute niemals mit Java anfangen sollten, weil das die Programmierer werden, die immer vergessen ihren "Muell" wieder aus dem Speicher zu entfernen.
Also, so kategorisch würde ich das nicht ausdrücken wollen ... in Zeiten der GHz- schweren Rechner mit 1 GB RAM samt 2 GB Swap- RAM ergeben sich selten solche Probleme, aber auf Controllern geht's schon beengter zu, weil der Heap u.U. fragmentiert und für größere Objekte dann der Speicher fehlt
.
Nachvollziehbares Beispiel:
Man bezieht seinen Speicher für structs scheibchenweise per malloc bis knapp an die Füllgrenze und schicke dann jede zweite struct per free in den Datenfriedhof. Theoretisch müßte jetzt ungefähr der halbe Speicher frei sein und den gönnt man sich auch, weil man gerade einen großen Buffer braucht ... und fällt auf die Nase!
Es ist zwar ausreichend Speicher frei, aber nicht in einem ausreichend großen zusammenhängenden Stück - das ist nämlich die Hauptaufgabe der GC, dafür zu sorgen :p ! Sie rafft die verstreuten Kacheln wieder zur Fläche zusammen
.
C/C++ sehen da imho nichts vor - alle meine C- Compiler produzieren Code, der genau an solchen Problemen scheitert, ganz ohne Memory Leak.Zur Umgehung solcher Probleme hilft vermutlich nur, kritische malloc/free- Kombinationen zu vermeiden, oder selbst eine Art GC zu produzieren.
Eine GC ist allerdings ein Performance- Fresser, der sich immer dann einschaltet, wenn der Speicher ausgeht und somit nicht unbedingt, wenn es die Betriebssituation erlaubt. Da bei C auch einfache Portabilität und Geschwindigkeit hohe Priorität beim Sprachentwurf hatten, gibt's halt keinen GC.
Aber Memory Leaks kann eine GC sowieso nicht abdichten, nur deren Folgen verzögern. Insofern ist der von pli erhobene Vorwurf nicht stichhaltig
-
Gottseidank ist bei C/C++ keine GC dabei, weil diese sich immer dann störend einschaltet, wenn man es gerade nicht brauchen kann.
Schön wären ein paar standardisierte Libraries die man benutzen kann um für vordefinierte Speicherblöcke eine GC zu implementieren.
sonst muß ich PLI rechtgeben. Es gibt zu viele Leute die sich um soetwas keinen Kopf machen, da es ja üblich ist.
"Programm frisst zu viel Performance, nehmen wir einen schnelleren Processor",
"Programm frisst zu viel Speicher, nehmen wir halt ein 1 GB mehr"
anstelle sich über das eigene Design Gedanken zu machen. Schau die viel kommerziell Produkte und ihren Speicher/performance Verbrauch nur an.
-
groovemaster schrieb:
c°h° schrieb:
Hi, besitzt ANSI C keinen Garbage Collector ?
Nun, letztendlich ist das die Angelegenheit der Implementation. Ich kenne jedoch keinen Compiler, der lokale Variablen mit GC managed.
wenn mans genau nimmt gibt es für lokale variablen einen gc, auch wenn der nur so aussieht dass ein fester wert zum stackpointer addiert wird.
-
pointercrash() schrieb:
aber auf Controllern geht's schon beengter zu, weil der Heap u.U. fragmentiert und für größere Objekte dann der Speicher fehlt
.
wer auf kleinen controllern malloc verwendet hats nicht anders verdient.