Dynamischer Speicher - LinkFang.de





Dynamischer Speicher


Der dynamische Speicher, auch Heap (engl. für ‚Halde‘, ‚Haufen‘), Haldenspeicher oder Freispeicher ist ein Speicherbereich, aus dem zur Laufzeit eines Programms zusammenhängende Speicherabschnitte angefordert und in beliebiger Reihenfolge wieder freigegeben werden können. Die Freigabe kann sowohl manuell als auch mit Hilfe einer automatischen Speicherbereinigung erfolgen. Eine Speicheranforderung aus dem Heap wird auch dynamische Speicheranforderung genannt. Sie dient den Programmen dazu, über den vom Programmcode selbst und den fix reservierten Datenfeldern und dem Stack (Stapelspeicher) belegten Speicher hinaus noch zusätzlichen Pufferspeicher zur Verfügung zu haben.

Für die Anwendungsentwicklung bedeutet die dynamische Speicherverwaltung einen erheblichen zusätzlichen Aufwand und bildet eine häufige Fehlerquelle, insbesondere für Speicherlecks. Ein typischer Fehler ist zum Beispiel, dass Referenzen auf dynamisch belegten Speicher unbeabsichtigt überschrieben werden und der ursprünglich referenzierte Bereich nicht mehr freigegeben werden kann. Dies kann dann auch zu sogenannten hängenden Zeigern führen.

Unterschied zum Stack

Der Unterschied zum Stack besteht darin, dass beim Stack angeforderte Speicherabschnitte in der umgekehrten Reihenfolge wieder freigegeben werden müssen, in der sie angefordert wurden. Dies schränkt die Wiederverwendung nicht länger benötigter Stackbereiche ein; ebenso muss eine Funktion ihre Stack-Speicheransprüche vor ihrer Rückkehr zu der aufrufenden Funktion aufgeben. Beim Stack spricht man auch von automatischer Speicheranforderung. Der Zeitaufwand bei einer automatischen Speicheranforderung zur Laufzeit ist in der Regel deutlich geringer als bei der dynamischen Speicheranforderung. Da für den Stack meist nur ein kleiner Speicherbereich reserviert wird, kann bei intensiver Nutzung durch sehr große oder sehr viele Anforderungen ein unerwünschter Programmabbruch wegen Stack-Überlauf erfolgen.

Unterstützung von dynamischen Speicheranforderungen in Programmiersprachen

Programmiersprachen unterstützen die dynamische Speicheranforderung auf unterschiedliche Weisen. In ISO-C gibt es dafür beispielsweise die Funktionen malloc(), calloc() und realloc(). Mit der Funktion free() wird der Speicher dann wieder freigegeben.

In ISO-C++ gibt es außer den bereits von C übernommenen Funktionen die Möglichkeit, Speicher dynamisch mit Hilfe von new anzufordern bzw. mit delete wieder freizugeben.

Speicherverwaltung

Im Vergleich zum Stack ist die Verwaltung des Heaps durch die Laufzeitumgebung aufwändiger. Speicherbereiche sollen jederzeit von der Anwendung angefordert und in beliebiger Reihenfolge auch wieder freigegeben werden können. Die Größe der Bereiche sowie der Zeitpunkt der Anforderung oder Freigabe sind dabei unvorhersagbar.

An die dynamische Speicherverwaltung werden daher die folgenden, teils widersprüchlichen Anforderungen gestellt:

  • Hohe Geschwindigkeit
  • Effiziente Speichernutzung
  • Geringer Verwaltungsaufwand

Durch das spätere Freigeben eines Blocks kann es zu externer Fragmentierung kommen. Eine automatische Speicherbereinigung kann die freien Speicherbereiche wieder vereinigen, so dass größere freie Blöcke zur Verfügung stehen.

Für Echtzeit-Anwendungen kann eine dynamische Speicherverwaltung ungeeignet sein, da sowohl die Laufzeit als auch die erfolgreiche Allokation garantiert werden müssen.

Implementierung

Für die Verwaltung der freien Blöcke kommen verschiedene Datenstrukturen zum Einsatz:

Siehe auch

Weblinks


Kategorien: Speicherverwaltung

Quelle: Wikipedia - http://de.wikipedia.org/wiki/Dynamischer Speicher (Vollständige Liste der Autoren des Textes [Versionsgeschichte])    Lizenz: CC-by-sa-3.0

Änderungen: Alle Bilder mit den meisten Bildunterschriften wurden entfernt. Ebenso alle zu nicht-existierenden Artikeln/Kategorien gehenden internen Wikipedia-Links (Bsp. Portal-Links, Redlinks, Bearbeiten-Links). Entfernung von Navigationsframes, Geo & Normdaten, Mediadateien, gesprochene Versionen, z.T. ID&Class-Namen, Style von Div-Containern, Metadaten, Vorlagen, wie lesenwerte Artikel. Ansonsten sind keine Inhaltsänderungen vorgenommen worden. Weiterhin kann es durch die maschinelle Bearbeitung des Inhalts zu Fehlern gerade in der Darstellung kommen. Darum würden wir jeden Besucher unserer Seite darum bitten uns diese Fehler über den Support mittels einer Nachricht mit Link zu melden. Vielen Dank!

Stand der Informationen: August 201& - Wichtiger Hinweis: Da die Inhalte maschinell von Wikipedia übernommen wurden, ist eine manuelle Überprüfung nicht möglich. Somit garantiert LinkFang.de nicht die Richtigkeit und Aktualität der übernommenen Inhalte. Sollten die Informationen mittlerweile fehlerhaft sein, bitten wir Sie darum uns per Support oder E-Mail zu kontaktieren. Wir werden uns dann innerhalb von spätestens 10 Tagen um Ihr Anliegen kümmern. Auch ohne Anliegen erfolgt mindestens alle drei Monate ein Update der gesamten Inhalte.