- Reference counting
-
Unter Referenzzählung (engl. reference counting) versteht man in der Programmierung eine Technik zur Verwaltung der Anzahl der Verweise (Referenzen oder Zeiger) auf ein bestimmtes Objekt. Das primäre Ziel ist dabei, zu erkennen, wann ein Objekt nicht mehr benötigt wird und gelöscht werden kann.
Inhaltsverzeichnis
Implementierung
Um eine solche Referenzzählung zu implementieren, ist es nötig, zu jedem Objekt einen Referenzzähler zu verwalten. Zudem muss sichergestellt werden, dass dieser Zähler bei Etablierung jeder zusätzlichen Referenzierung inkrementiert und bei Beendigung einer Referenzierung dekrementiert wird.
Bei konsistenter Implementierung einer solchen Vorgehensweise sind zwei Bedingungen immer erfüllt:
- Alle noch referenzierten (benutzten) Objekte haben einen Zähler ungleich 0.
- Alle Objekte mit einem Zähler gleich 0 werden nicht mehr referenziert.
Ein Problem bei dieser Technik sind zyklische Verweise, das heißt zwei oder mehrere Objekte die gegenseitig aufeinander verweisen. Falls dabei Objekte nur noch gegenseitig aufeinander verweisen und kein Verweis von außen mehr existiert, das heißt von anderen Objekten außerhalb des Zyklus, sind die jeweiligen Referenzzähler nicht 0 und es ist nicht so ohne weiteres erkennbar, dass diese Objekte eigentlich nicht mehr benötigt werden. Falls eine solche Situation nicht grundsätzlich ausgeschlossen werden kann, existieren zur Erkennung einer solchen Situation unterschiedliche Algorithmen, die sich zumeist am Prinzip der Erreichbarkeit in Graphen orientieren.
Anwendungsfälle
In Programmiersprachen mit automatischer Speicherverwaltung wie beispielsweise Java oder C# wird die Freigabe nicht mehr benötigter Objekte durch die Laufzeitumgebung gewährleistet, die hierzu gegebenenfalls eine Referenzzählung verwendet.
In Programmiersprachen ohne eine solche automatische Speicherverwaltung wie beispielsweise C oder C++ kann es erforderlich sein, eine solche Referenzzählung selbst zu implementieren, wenn die Reihenfolge der Freigabe von Objekten nicht in einer vorhersehbaren und klar definierten Reihenfolge mit offensichtlichen hierarchischen Abhängigkeiten implementierbar ist. In objektorientierten Sprachen wie C++ ist es dabei angebracht, ein solches Verfahren durch eine Klasse zu kapseln. Ein typisches Beispiel ist dabei eine String-Klasse, die sicherstellt, dass gleichartige Inhalte nur einmal im Speicher angelegt werden und dennoch gewährleistet, dass unbenötigte Inhalte gelöscht werden, ohne dass sich der Programmierer explizit Gedanken darum machen muss.
Siehe auch
Literatur
- Scott Meyers; More Effective C++; Addison-Wesley 1996
Weblinks
Wikimedia Foundation.