Seite 1 von 1
Garbage Collection mit Qt
Verfasst: 19. Juni 2006 01:39
von Sym
Hallo,
ich kann leider nichts direktes dazu bei Trolltech finden oder bin auch nur zu doof.
Ich habe hier im Forum ein paar Äußerungen dbzgl. gesehen und wollte noch mal nach Quellen dafür fragen.
Ich habe das Problem, dass ich während der Laufzeit neue Widgets erzeugen muss und zerbreche mir den Kopf, wie ich diese nach Beendigung wieder aus dem Speicher haue.
Doch wenn ich das hier richtig gelesen habe, sorgt Qt selbst für den Speicher und gibt mit der Zeit alles wieder frei, was nicht mehr genutzt wird und von QObject erbt. Ist das richtig? Gibt es dazu vernünftige Quellen?
Das würde natürlich meine gesamte Struktur ändern bzw. in Zukunft einiges vereinfachen.
Gruß und Dank
Verfasst: 19. Juni 2006 06:31
von Christian81
Hier z.B.
http://doc.trolltech.com/4.1/qobject#details
Allerdings fnde ich es nicht gut wenn man es einem GC überlässt den Speicher wieder freizugeben - ist so eine blöde Java-Unart...
Verfasst: 19. Juni 2006 11:27
von BartSimpson
Du bist der GC:)
Denn woher soll Qt wissen was noch gebraucht wird und was nicht.
Denn manchmal kann es durchaus Sinn machen nicht alles gleich wegzuwerfen. Und Qt räumt auch nur bein beenden auf!!
bzw. wenn das oberberste Objekt gelöscht wird.
Eigenlich soll es nur verhindern, das man ausbersehen Objekte liegen läßt.
Das was die in Java eingebaut haben, fördert ja gerade zu die unsaube programmierung. So nach dem Motto da wird sich schon jemand drum kümmern:(
Verfasst: 19. Juni 2006 12:26
von Sym
Ok,
wunderbar. Und schön, dass ich es übersehen hatte.
Aber wir handhabt ihr dass, wenn ihr zur Laufzeit Widgets vom User erzeugen lasst? Die Anzahl ist vorher unbekannt.
Diese Widget müssen ja auf den Heap, damit sie existent bleiben. Speichert ihr die Pointer in einer Liste?
Als Beispiel habe ich eine Methode
createNewWidget(). Soll die jetzt den Pointer zurückgeben? Was ist da die saubere Methode.
Und ich gebe zu, dass ich mit Java OOP gelernt habe.

Verfasst: 19. Juni 2006 12:42
von BartSimpson
sicher landen die auf dem Heap. Und wenn man weis, das man die nicht mehr braucht, werden diese lauber mit einem delte gelöscht. Aber in deinem Fall ginbt es in Qt ein Contrainer(der Name fällt mir gerade nicht ein), welche Zeiger speichert, und wenn du den Zeiger aus dem Container löscht, wird automatisch das Objekt auf dem Heap mit gelöscht.
Verfasst: 19. Juni 2006 12:54
von BartSimpson
So habe es gefunden. Du solltest dir mal QCache anschauen. Das könnte eventuell für deinen konkreten Fall nützlich sein.
Verfasst: 19. Juni 2006 12:56
von Sym
Jau, wunderbar. Danke. Das war genau das Richtige.
Re: Garbage Collection mit Qt
Verfasst: 20. Juni 2006 16:34
von OscarWild
Sym hat geschrieben:Doch wenn ich das hier richtig gelesen habe, sorgt Qt selbst für den Speicher und gibt mit der Zeit alles wieder frei, was nicht mehr genutzt wird und von QObject erbt. Ist das richtig?
Jein. "Von alleine" gibt Qt nichts frei; normalerweise werden aber von QObject abgeleitete Objekte in Parent-Objekte eingehängt, entweder direkt durch Angabe des Parents, oder indirekt, z.B. beim Einhängen eines Widgets per addWidget() in ein Layout.
Wird das Parent-Object zerstört, zerstört es automatisch seine Kinder, um die man sich daher zum Glück nicht einzeln kümmern muss, gerade wenn die auch noch dynamisch erzeugt werden (ich denke, darauf wolltest Du raus.)
BartSimpson hat geschrieben:Denn woher soll Qt wissen was noch gebraucht wird und was nicht.
Dafürt gibt es ganz erstaunliche Algorithmen. Siehe auch
hier
Christian81 hat geschrieben:ist so eine blöde Java-Unart
Viel unartiger ist es, wenn einem der Speicher volläuft.
Verfasst: 20. Juni 2006 20:47
von Volker
BartSimpson hat geschrieben:sicher landen die auf dem Heap. Und wenn man weis, das man die nicht mehr braucht, werden diese sauber mit einem delete gelöscht.
Wenn ich das richtig verstanden habe, sollen Objekte die von QObject ableiten doch mit deleteLater() gelöscht werden. Oder verbleibt dabei was im Speicher? Die Pointer Variable selbst liegt ja auf dem Stack und wird somit beim Verlassen des Gültilgkeitsbereichs gelöscht.
Verfasst: 20. Juni 2006 23:10
von OscarWild
Volker hat geschrieben:Wenn ich das richtig verstanden habe, sollen Objekte die von QObject ableiten doch mit deleteLater() gelöscht werden.
Damit markierst Du die Objekte für Qt lediglich als löschbereit.
Volker hat geschrieben:Oder verbleibt dabei was im Speicher?
Die Objekte bleiben bis zum Wiedereintritt in die Main Event Loop im Speicher, werden dann aber gelöscht. Sollen die Objekte sofort weg, dann benutze das konventionelle delete.
Volker hat geschrieben:Die Pointer Variable selbst liegt ja auf dem Stack und wird somit beim Verlassen des Gültilgkeitsbereichs gelöscht.
So isses.
Verfasst: 21. Juni 2006 02:04
von Sym
Ich habe es mit QCache gelöst. Funktioniert wunderbar. Keine Speicherprobleme mehr.