Cyclic Garbage Collection
Verfasst: Montag 9. November 2009, 23:30
Moin,
ich habe mal eine frage zur Auflösung der zyklischen Abhängigkeiten und damit verbundenen Speicherfreigabe. Leider wird nämlich bei mir der Speicher nicht freigegeben (jedenfalls glaube ich das es so ist). Folgende Funktionen habe ich implementiert:
Wenn ich eine zyklische Verkettung einbaue und danach "del myVar" aufrufe, dann erscheint der Text "fertig" nicht, so dass ich annehme das das dealloc nicht ausgeführt wird. Wenn ich den Interpreter verlasse erscheint die "Res-Ausgabe" 2*self->len Mal, aber der Wert ist immer 0. Eigentlich sollte er doch mal <> 0 sein, wenn die visit-function einen Zyklus entdeckt hat. Leider scheint sie den nicht zu finden, denn ich sehe keine "Clear" und keine "Fertig"-Ausgabe ;(
Hat jemand vielleicht einen Tip für mich woran es liegen kann?
Gruß
Jonny
P.s. Im TypeObject sind dealloc, traverse und clear registriert und Py_TPFLAGS_HAVE_GC ist gesetzt.
ich habe mal eine frage zur Auflösung der zyklischen Abhängigkeiten und damit verbundenen Speicherfreigabe. Leider wird nämlich bei mir der Speicher nicht freigegeben (jedenfalls glaube ich das es so ist). Folgende Funktionen habe ich implementiert:
Code: Alles auswählen
static int
My_traverse(MyObject *self, visitproc visit, void *arg) {
unsigned int i;
int res = 0;
for (i = 0; (i < self->len) && (res == 0); ++i) {
res = visit(self->e[i], arg);
PySys_WriteStdout("Res = %d\n", res);
}
return res;
}
static int
My_clear(MyObject* self) {
unsigned int i;
PySys_WriteStdout("Clear");
for (i = 0; i < self->len; ++i) {
Py_CLEAR(self->e[i]);
}
return 0;
}
static void
My_dealloc(MyObject *self) {
My_clear(self);
Py_TYPE(self)->tp_free((PyObject*) self);
PySys_WriteStdout("%s", "fertig\n");
}
Hat jemand vielleicht einen Tip für mich woran es liegen kann?
Gruß
Jonny
P.s. Im TypeObject sind dealloc, traverse und clear registriert und Py_TPFLAGS_HAVE_GC ist gesetzt.