Speicher, Adressen und Lebensdauer
Ein Objekt belegt Speicher, in dem seine Darstellung liegt. Eine Adresse beschreibt einen Ort im Speicherraum des laufenden Programms. Der Typ bestimmt, wie passende Operationen die dortige Darstellung verwenden dürfen. Dieselben Bytes darfst du nicht beliebig als irgendeinen anderen Typ behandeln.
Speicher, Adressen und Lebensdauer#
Referenzen, Zeiger und Speicher · Lektion 32 von 60
Voraussetzungen: Funktionen, Container. Lernziel: Du trennst Speicherplatz, Sichtbarkeit und Existenz eines Objekts.
Ein Objekt belegt Speicher, in dem seine Darstellung liegt. Eine Adresse beschreibt einen Ort im Speicherraum des laufenden Programms. Der Typ bestimmt, wie passende Operationen die dortige Darstellung verwenden dürfen. Dieselben Bytes darfst du nicht beliebig als irgendeinen anderen Typ behandeln.
1#include <iostream>2 3int main() {4 int zahl{42};5 std::cout << "Wert: " << zahl << '\n';6 std::cout << "Adresse: " << &zahl << '\n';7 std::cout << "Groesse: " << sizeof(zahl) << '\n';8}&zahl ist hier der Adressoperator. Er liefert einen Zeiger auf zahl, also einen Wert, über den das Objekt gefunden werden kann. Die ausgegebene Adresse ist nicht vorhersehbar und kann bei jedem Start anders sein. sizeof(zahl) liefert die Größe in C++-Bytes.
Lebensdauer ist mehr als ein Name#
Die Lebensdauer beschreibt, wann ein Objekt gültig existiert. Der Gültigkeitsbereich beschreibt, wo ein Name im Quelltext sichtbar ist. Ein Name kann kurz sichtbar sein, während der verwaltete Speicher anderswo länger lebt; umgekehrt kann ein gespeicherter Verweis noch existieren, nachdem sein Ziel bereits zerstört wurde.
Speicherdauer beschreibt die grundlegende Bereitstellung des Speicherbereichs. Eine normale lokale Variable hat automatische Speicherdauer. Ein mit static definiertes entsprechendes Objekt bleibt über einzelne Funktionsaufrufe hinaus bestehen. Dynamisch bereitgestellter Speicher wird ausdrücklich oder durch verwaltende Objekte freigegeben.
Stack und Heap#
Der Stack ist ein bei üblichen Implementierungen verwendeter Stapel für Aufrufinformationen und viele lokale Objekte. Der Heap bezeichnet im Alltag einen Bereich für dynamische Speicherbereitstellung. Die Sprache schreibt nicht vor, dass jede lokale Variable an einer bestimmten physischen Stelle liegen muss; Optimierungen dürfen die tatsächliche Umsetzung verändern.
Ein lokaler Vector ist ein gutes Gegenbeispiel zu groben Faustregeln: Das Vectorobjekt kann automatisch leben und intern dynamischen Speicher für seine Elemente verwalten. Beim Ende des lokalen Gültigkeitsbereichs räumt sein Destruktor auch diesen Speicher auf.
Ein Destruktor ist eine besondere Funktion, die beim Zerstören eines Objekts dessen Aufräumarbeiten übernimmt. Dieses Prinzip führt zu RAII, der automatischen Kopplung von Ressourcen an Objektlebensdauern.
Typischer Denkfehler#
„Die alte Adresse steht noch im Zeiger, also ist der Wert noch da“ ist falsch. Ein gespeicherter Adresswert verlängert keine Lebensdauer. Nach dem Ende des Zielobjekts darfst du darüber nicht mehr auf das frühere Objekt zugreifen.
Übung#
Warum solltest du in einem Test nicht eine feste Adresse wie 0x1234 für zahl erwarten?
Lösung
Die Speicherbelegung hängt vom Prozess, Betriebssystem und Build ab. Prüfe die fachlichen Werte und Beziehungen, nicht eine zufällige numerische Adresse.
Weiterlernen#
Zurück: Standardalgorithmen statt selbst gebauter Schleifen · Kursübersicht · Weiter: Referenzen: ein zweiter Name für ein Objekt
Kommentare 0
Kommentare sind für diese Seite deaktiviert.