Garbage Collection mit Qt
Garbage Collection mit Qt
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
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
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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...
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...
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
-
BartSimpson
- Beiträge: 1379
- Registriert: 6. November 2004 12:03
- Kontaktdaten:
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:(
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:(
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.
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.
-
BartSimpson
- Beiträge: 1379
- Registriert: 6. November 2004 12:03
- Kontaktdaten:
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.
-
BartSimpson
- Beiträge: 1379
- Registriert: 6. November 2004 12:03
- Kontaktdaten:
Re: Garbage Collection mit Qt
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.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?
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.)
Dafürt gibt es ganz erstaunliche Algorithmen. Siehe auch hierBartSimpson hat geschrieben:Denn woher soll Qt wissen was noch gebraucht wird und was nicht.
Viel unartiger ist es, wenn einem der Speicher volläuft.Christian81 hat geschrieben:ist so eine blöde Java-Unart
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.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.
Damit markierst Du die Objekte für Qt lediglich als löschbereit.Volker hat geschrieben:Wenn ich das richtig verstanden habe, sollen Objekte die von QObject ableiten doch mit deleteLater() gelöscht werden.
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:Oder verbleibt dabei was im Speicher?
So isses.Volker hat geschrieben:Die Pointer Variable selbst liegt ja auf dem Stack und wird somit beim Verlassen des Gültilgkeitsbereichs gelöscht.