Benutzten Speicher befreien

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Tom

Mittwoch 4. August 2004, 12:51

Hallo zusammen,
ich benutze verschachtelte Datenstrukturen in Python und frage mich, was mit dem davon belegten Speicher geschieht, wenn dem Namen der Struktur eine andere Struktur zugewiesen wird, dh. wenn auf die existierende Struktur kein Pointer mehr zeigt.

Meines Wissens gibt es keine "free(<var_name>)"-Funktion, equivalent etwa zu C.

Mein Problem also: Wie verhindere ich in Python, dass der Speicher von nicht mehr benötigten Datenstrukturen zugemüllt wird? Merkt der Python-Interpreter am Ende selbst, wenn zu einem Datum kein Pointer mehr existiert?

Wär super, wenn mir jemand hierzu einen Tip geben könnte, ich hab bisher nichts dazu gefunden.

Gruß Thomas
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Mittwoch 4. August 2004, 13:14

Hi. Wenn Objekte von außen nicht mehr erreichbar sind, werden sie Opfer der Garbage Collection. Ein Beispiel:

Code: Alles auswählen

class A: pass
a=A()
a.b=a
del a
Nun ist a nicht mehr erreichbar und wird dennoch referenziert (von a.b). a.b wird aber auch nicht gelöscht, da "a" darauf zeigt. Trotzdem werden die beiden Objekte während der Laufzeit gelöscht, da der Garbage Collector aktiv ist. Dieser ist von Python aus direkt ansprechbar, über das Modul gc. Darin findest du auch nähere Informationen zu dem Thema.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Mittwoch 4. August 2004, 13:37

Hi auch,

das von Milan gezeigte Beispiel ist ein Sonderfall, der vom Garbagecollector behandelt wird.
Wenn auf ein "normales" Objekt keine Referenz mehr zeigt wird das Objekt bei nächster Gelegenheit gelöscht und die Resourcen freigegeben. Intern haben Pythonobjekte einen Referenzzähler, der bei jeder Zuweisung des Objekts zu einem Variablennamen oder zu einem komplexen Datentyp (z.B. Liste oder Dictionary) hochgezählt und wenn die Variable nicht mehr gebraucht wird, oder das Objekt aus der Liste oder dem Dictionary entfernt wird wieder runtergezählt wird. Ist der Zähler dann auf Null weiss Pyton, daß das Objekt nicht mehr gebraucht wird und ruft dessen __del__ Methode auf oder, bei nichtforhandensein einer solchen, wird der Speicher, den das Objekt belegt freigegeben und alle attribute, die ja auch auf Objekte zeigen gelöscht und damit deren Referenzzähler um eins verringert.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Montag 6. September 2004, 12:25

Hallo,
vielen Dank für die Information! mein "Problem" ist damit erledigt.

Gruß Thomas
Antworten