HÜ 6, A2: Freigabe von Speicher

tmx-master
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 253
Registriert: 25. Okt 2006 17:44

HÜ 6, A2: Freigabe von Speicher

Beitrag von tmx-master »

Hi,
ein Schwerpunkt bei der Aufgabe so es wohl sein, die Speicheralloklationen und -freigaben von dynamischen Arrays richtig zu handhaben.

Frage: Nur der Arrays?

Generelle Frage dazu:
Wie sind lokale Variablen (z.B. das beliebte int i,j;) zu behandeln? Sind die auch IMMER freizugeben (nach dem Motto: Kleinvieh macht auch Mist)? Wird das erwartet, oder sind solche Freigaben im Umfeld von C nicht notwendig (im Online-Buch wird das in einigen Beispielen gezeigt!)? Gibt es da so etwas wie eine Faustregel?
Klar ist, dass dynamische Strukturen, von denen man eben nicht genau weiß, wie groß die werden können, eine Freigabe benötigen. Aber wie geht man mit (lokalen) Variablen fixer Größe um. Konsequenterweise müsste man die (bzw. den Speicherplatz) ja auch wieder freigegeben.
Gruß TM

Benutzeravatar
Red*Star
Kernelcompilierer
Kernelcompilierer
Beiträge: 510
Registriert: 28. Nov 2006 19:40

Beitrag von Red*Star »

Konsequent ist, alles was mit malloc() etc. reserviert wurde, auch wieder freizugeben.

Wenn du in einer Methode irgendwo int i schreibst, legst du ja quasi implizit Stackspeicher an, um den sich die Funktion nach Beendigung ihrer Hauptaufgabe selbst kümmert - da brauchst du also überhaupt keine Freigaben durchzuführen. Mit malloc() hingegen legst du Speicher auf dem Heap an.

Hm, wenn du eine Faustregel willst, hier wäre meine selbst erdichtete:

Ein malloc() braucht ein free(), ein int i nie. ^^

(Der Vollständigkeit halber sollte ich hier aber sagen, dass es neben malloc() auch noch andere *alloc()s gibt, z.B. realloc() und calloc() u.v.m., deren Aufgabe du in diversen C-Referenzen nachlesen kannst. Sieh das da oben also wirklich nur als Faustregel.)
Was Sonnenschein für das schwarze Erdreich ist,
ist wahre Aufklärung für die Verwandten des Erdreichs.

- N.F.S. Grundtvig

tmx-master
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 253
Registriert: 25. Okt 2006 17:44

Beitrag von tmx-master »

Hi Red*Star,

prima Antwort. So hätte ich dass dann auch gesehen. Du hast das gut auf den Punkt gebracht. Danke.

@ChrSch: Gibt es da aus Sicht der Experten noch etwas zu ergänzen? Wenn nein, sollte das nun der Standard für die Übungen sein.
Gruß TM

Mira`
Mausschubser
Mausschubser
Beiträge: 92
Registriert: 27. Okt 2006 20:41

Beitrag von Mira` »

Also müssen wir doch nur Speicher für die Ergebnismatrix reservieren und wieder freigeben, oder?
Und wenn ich die Folien von der C Einführung richtig verstanden habe, sollte der Aufrufer den Speicher reservieren und wieder freigeben. Also z.B. so:
- Speicher reservieren für Ergebnismatrix
- Funktionsaufruf (Ergebnismatrix berechnen)
- Ergebnismatrix ausgeben
- Speicher wieder freigeben

Kann das jmd bestätigen?

Benutzeravatar
Red*Star
Kernelcompilierer
Kernelcompilierer
Beiträge: 510
Registriert: 28. Nov 2006 19:40

Beitrag von Red*Star »

Mira` hat geschrieben:Also z.B. so:
- Speicher reservieren für Ergebnismatrix
- Funktionsaufruf (Ergebnismatrix berechnen)
- Ergebnismatrix ausgeben
- Speicher wieder freigeben

Kann das jmd bestätigen?
Ich kann es dir insoweit bestätigen, als dass es z.B. bei strcpy() genauso abläuft und auch logisch ist. Ich hoffe das reicht dir ;).
Was Sonnenschein für das schwarze Erdreich ist,
ist wahre Aufklärung für die Verwandten des Erdreichs.

- N.F.S. Grundtvig

Benutzeravatar
chrschn
Mausschubser
Mausschubser
Beiträge: 80
Registriert: 19. Jun 2007 11:46
Wohnort: Darmstadt
Kontaktdaten:

Beitrag von chrschn »

Red*Star hat die Vorgehensweise sehr gut erläutert, und den Merksatz finde ich toll. ;-)
Mira` hat geschrieben:Speicher reservieren für Ergebnismatrix
Man muss in den Speicher für das Ergebnis nicht zwangsläufig mit malloc() reservieren. Die Ziel-Matrix kann auch einfach in der main-Methode mittels int result[M*P] deklariert und der Multiplikationsfunktion übergeben werden. Diese Vorgehensweise ist ratsam, da dieser Speicher komplett vom Compiler verwaltet wird. Also ist keine Überprüfung des Rückgabewertes von malloc() auf 0 nötig, der Speicher muss nicht explizit freigegeben werden, usw.

Gruß,
Christian Schneider

Benutzeravatar
Red*Star
Kernelcompilierer
Kernelcompilierer
Beiträge: 510
Registriert: 28. Nov 2006 19:40

Beitrag von Red*Star »

Ja, klingt nur leider etwas holprig. Leider klappt

Ein malloc() braucht ein free(), ein int i hingegen nie.

auch nicht, auch wenn es ein bisschen besser ist. Am besten wär vom Rhythmus her

Ein malloc() braucht ein free(), ein int hingegen nie.

aber das macht ja wiederum keinen Sinn. Ich sehe schon, ich bin kein Goethe... ist aber andererseits auch gut so ^^


Mir fällt gerade ein, Christian, zu meiner Frage aus deiner C-Einführungsveranstaltung - wie "groß" ein void-Pointer sei (sprich wieviele Bytes würde die (p + 1)-Speicherstelle von der p-Speicherstelle entfernt sein, wenn p über "void * p;" deklariert wurde) -, hast du da inzwischen eine Antwort drauf gefunden? Ansonsten muss ich mich wohl selbst noch mal auf die Suche danach machen...
Was Sonnenschein für das schwarze Erdreich ist,
ist wahre Aufklärung für die Verwandten des Erdreichs.

- N.F.S. Grundtvig

citta
Mausschubser
Mausschubser
Beiträge: 96
Registriert: 7. Nov 2006 21:52

Beitrag von citta »

Red*Star hat geschrieben:
Mir fällt gerade ein, Christian, zu meiner Frage aus deiner C-Einführungsveranstaltung - wie "groß" ein void-Pointer sei (sprich wieviele Bytes würde die (p + 1)-Speicherstelle von der p-Speicherstelle entfernt sein, wenn p über "void * p;" deklariert wurde) -, hast du da inzwischen eine Antwort drauf gefunden? Ansonsten muss ich mich wohl selbst noch mal auf die Suche danach machen...
Antwort im Vorlesungsforum
http://www.fachschaft.informatik.tu-dar ... hp?t=10376

Benutzeravatar
Red*Star
Kernelcompilierer
Kernelcompilierer
Beiträge: 510
Registriert: 28. Nov 2006 19:40

Beitrag von Red*Star »

Oh, übersehen. Danke.
Was Sonnenschein für das schwarze Erdreich ist,
ist wahre Aufklärung für die Verwandten des Erdreichs.

- N.F.S. Grundtvig

Antworten

Zurück zu „Archiv“