Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
Vorwort des Gutachters
1 Einstieg in C
2 Das erste Programm
3 Grundlagen
4 Formatierte Ein-/Ausgabe mit »scanf()« und »printf()«
5 Basisdatentypen
6 Operatoren
7 Typumwandlung
8 Kontrollstrukturen
9 Funktionen
10 Präprozessor-Direktiven
11 Arrays
12 Zeiger (Pointer)
13 Kommandozeilenargumente
14 Dynamische Speicherverwaltung
15 Strukturen
16 Ein-/Ausgabe-Funktionen
17 Attribute von Dateien und das Arbeiten mit Verzeichnissen (nicht ANSI C)
18 Arbeiten mit variabel langen Argumentlisten – <stdarg.h>
19 Zeitroutinen
20 Weitere Headerdateien und ihre Funktionen (ANSI C)
21 Dynamische Datenstrukturen
22 Algorithmen
23 CGI mit C
24 MySQL und C
25 Netzwerkprogrammierung und Cross–Plattform-Entwicklung
26 Paralleles Rechnen
27 Sicheres Programmieren
28 Wie geht’s jetzt weiter?
A Operatoren
B Die C-Standard-Bibliothek
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch
Buch: C von A bis Z

C von A bis Z
3., aktualisierte und erweiterte Auflage, geb., mit CD und Referenzkarte
1.190 S., 39,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1411-7
Pfeil 14 Dynamische Speicherverwaltung
Pfeil 14.1 Das Speicherkonzept
Pfeil 14.2 Speicherallokation mit »malloc()«
Pfeil 14.3 Das NULL-Mysterium
Pfeil 14.3.1 NULL für Fortgeschrittene
Pfeil 14.3.2 Was jetzt – NULL, 0 oder \0 ... ?
Pfeil 14.3.3 Zusammengefasst
Pfeil 14.4 Speicherreservierung und ihre Probleme
Pfeil 14.5 »free()« – Speicher wieder freigeben
Pfeil 14.6 Die Freispeicherverwaltung
Pfeil 14.6.1 Prozessinterne Freispeicherverwaltung
Pfeil 14.7 Dynamische Arrays
Pfeil 14.8 Speicher dynamisch reservieren mit »realloc()« und »calloc()«
Pfeil 14.9 Speicher vom Stack anfordern mit »alloca()« (nicht ANSI C)
Pfeil 14.10 »free()« – Speicher wieder freigeben
Pfeil 14.11 Zweidimensionale dynamische Arrays
Pfeil 14.12 Wenn die Speicherallokation fehlschlägt
Pfeil 14.12.1 Speicheranforderung reduzieren
Pfeil 14.12.2 Speicheranforderungen aufteilen
Pfeil 14.12.3 Einen Puffer konstanter Größe verwenden
Pfeil 14.12.4 Zwischenspeichern auf Festplatte vor der Allokation
Pfeil 14.12.5 Nur so viel Speicher anfordern wie nötig


Rheinwerk Computing - Zum Seitenanfang

14.5 »free()« – Speicher wieder freigeben topZur vorigen Überschrift

Wenn Sie Speicher vom Heap angefordert haben, sollten Sie diesen auch wieder zurückgeben. Der allozierte Speicher wird mit folgender Funktion freigegeben:

#include <stdlib.h>

void free (void *p)

Der Speicher wird übrigens auch ohne einen Aufruf von free() freigegeben, wenn sich das Programm beendet.


Hinweis

Zwar wird generell behauptet (und es ist auch meistens der Fall), dass bei der Beendigung eines Programms das Betriebssystem den reservierten und nicht mehr freigegebenen Speicher selbst organisiert und somit auch wieder freigibt, aber dies ist nicht vom ANSI/ISO-Standard gefordert.

Somit hängt dieses Verhalten also von der Implementation der Speicherverwaltung des Betriebssystems ab.


Ein Beispiel zu free():

/* free1.c */
#include <stdio.h>
#include <stdlib.h>

int main(void) {
   int *p = malloc(sizeof(int));

   if(p != NULL) {
      *p=99;
      printf("Allokation erfolgreich ... \n");
      }
   else {
      printf("Kein virtueller RAM mehr verfügbar ... \n");
      return EXIT_FAILURE;
   }
   if(p != NULL)
      free(p);
   return EXIT_SUCCESS;
}

Es wird hier auch überprüft, dass nur wirklich reservierter Speicherplatz wieder freigegeben wird. Der mit free() freigegebene Speicherplatz wird danach zwar als frei markiert, aber p zeigt immer noch auf die ursprüngliche Speicherstelle. Hier sehen Sie das Beispiel:

/* free2.c */
#include <stdio.h>
#include <stdlib.h>

int main(void) {
   int *p = malloc(sizeof(int));

   if(p != NULL) {
         *p=99;
         printf("Allokation erfolgreich ... \n");
   }
   else {
      printf("Kein virtueller RAM mehr verfügbar ... \n");
      return EXIT_FAILURE;
   }
   printf("vor free() *p = %d\n", *p);
   if(p != NULL)
      free(p);
   printf("nach free() *p = %d\n", *p);
   return EXIT_SUCCESS;
}

Hinweis

Da der Heap üblicherweise aus Performance-Gründen nicht wieder reduziert wird, konnten Sie wie hier im Beispiel eventuell auf den freigegebenen Speicherplatz und dessen Inhalt wieder zugreifen. Aber dieses Verhalten ist nicht »portabel« und wird auch nicht vom ANSI–C-Standard gefordert. Sofern Sie also vorhaben, so etwas absichtlich in der Praxis auszuführen (warum auch immer), ist das Verhalten undefiniert.


Wenn Sie absolut sicher sein wollen, dass der Zeiger nichts mehr zurückgibt, dann übergeben Sie dem Zeiger nach der Freigabe von Speicher einfach den NULL-Zeiger:

free(p);
p = NULL;

Dies können Sie wie folgt in ein Makro verpacken:

#define my_free(x)  free(x); x = NULL

Internes

Die Speicherverwaltung merkt sich die Größe eines jeden Speicherblocks, der von Ihnen angefordert wurde – daher ist es auch nicht nötig, die Größe des Blocks (als echte Byte-Größe) anzugeben, um den Speicher mit free() wieder freizugeben. Leider gibt es daher allerdings auch keinen portablen Weg, um zu erfahren, wie groß dieser Speicherblock denn tatsächlich ist.


Was malloc() und die weiteren Speicherallokationsfunktionen so bedeutend und wichtig macht, ist die Möglichkeit, von jedem beliebigen Datentyp Speicher anfordern zu können – sind es nun einfache Datentypen wie Strings, Arrays oder komplexe Strukturen.

Natürlich können Sie auch Speicherplatz für ein char-Array zur Laufzeit anfordern. Das folgende Beispiel demonstriert dies:

/* malloc4.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUF 80

int main(void) {
   char puffer[BUF];
   char *dyn_string;

   printf("Ein Text mit max. 80 Zeichen: ");
   fgets(puffer, BUF, stdin);

   dyn_string = malloc(strlen(puffer) + 1);
   if(dyn_string != NULL)
      strncpy(dyn_string, puffer, strlen(puffer) + 1);
   else {
      printf("Konnte keinen Speicherplatz reservieren\n");
      return EXIT_FAILURE;
   }
   printf("%s",dyn_string);
   free(dyn_string);
   return EXIT_SUCCESS;
}

Wobei erwähnt werden muss, dass diese Art, dynamisch Speicher für einen Text zu reservieren, noch recht unflexibel ist. Mit

dyn_string = malloc(strlen(puffer) + 1);

wird exakt so viel Speicher angefordert, wie zuvor mit fgets() in den String puffer eingelesen wurde. Im Verlauf des Buchs in Abschnitt 16.25, »Ein fortgeschrittenes Thema«, werden Sie erfahren, wie Sie viel effektiver dynamischen Speicher für Text anfordern. Denn bei diesem Beispiel hätten Sie es ja gleich beim char-Array puffer belassen können.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
<< zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z

 C von A bis Z
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: C/C++






 C/C++


Zum Katalog: Einstieg in C






 Einstieg in C


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de