Unter Referenzzählung (englisch reference counting) versteht man in der Programmierung eine Technik zur Verwaltung der Anzahl der Verweise (Referenzen oder Zeiger) auf ein bestimmtes Objekt. Das Ziel ist dabei, zu erkennen, wann ein Objekt nicht mehr benötigt wird und gelöscht werden kann. Referenzzählung ist eine Möglichkeit zur automatischen Speicherbereinigung.
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 größer 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.
Anwendungsbeispiele
Strukturen und Programmierumgebungen, die Referenzzählung betreiben:
- Cocoa
- Component Object Model
- Gambas
- GObject
- Inodes
- Object Pascal (nur für Strings)
- Perl 5
- PHP
- Python
- R (seit der Version 4)
- Squirrel
- Swift
- Vala
In Programmierumgebungen 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
Einzelnachweise
Literatur
- Scott Meyers; More Effective C++; Addison-Wesley 1996