Hallo,
ich habe hier eine Methode gefunden, um nach Speicherlöchern zu fahnden:
http://www.relisoft.com/book/tech/9new.html
- globalen new/delete operator überschreiben
- Operator new erstellt Listeneintrag, delete löscht Eintrag aus Liste
- sind am Ende noch Einträge in der Liste, so wurde ein delete vergessen
- als Listenverwalter wird ein globales Objekt verwendet
Ich frage mich nur, ob das auch mit QT zusammen funktioniert.
Das globale Protokollobjekt hat ja auch nur eine gewisse Lebenszeit.
QT könnte vorher oder nachher noch Dinge tun, die dem Protokollobjekt
schlichtweg entgehen?
Weiß jemand, ob sowas zuverlässig funktioniert, auch wenn da fremde Bibliotheken (QT) mitmischen?
Danke,
Stimpy
memory leaks - Speicherlöcher finden
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Geht doch nicht ohne weiteres...
Ha! Jetzt ist es genau da schiefgegangen, wo ich es vermutet hatte.
Ich habe mal das QT-Beispiel "Sliders" untersucht. Mich hatte schon immer gewundert, daß zahlreiche Widgets mit new erzeugt werden, aber keiner aufräumt. Hier im Forum bekam ich den Tip, daß das QT selbst erledigt.
Offenbar werden die Widgets nach Destruktion meines Trace-Objektes zerstört. Dieses meldet daraufhin die Widgets als vermißt!
1.) Kann ich wirklich davon ausgehen, daß QT alle Widgets aufräumt, die es anzeigt?
2.) Was mach ich mit den vermißten Widgets? (Nicht mitverfolgen?, Tracer-Destruktion per Timer verzögern?)
Jetzt bin ich kurz vorm Ziel, und wäre für Tips sehr dankbar.
Ich habe mal das QT-Beispiel "Sliders" untersucht. Mich hatte schon immer gewundert, daß zahlreiche Widgets mit new erzeugt werden, aber keiner aufräumt. Hier im Forum bekam ich den Tip, daß das QT selbst erledigt.
Offenbar werden die Widgets nach Destruktion meines Trace-Objektes zerstört. Dieses meldet daraufhin die Widgets als vermißt!
1.) Kann ich wirklich davon ausgehen, daß QT alle Widgets aufräumt, die es anzeigt?
2.) Was mach ich mit den vermißten Widgets? (Nicht mitverfolgen?, Tracer-Destruktion per Timer verzögern?)
Jetzt bin ich kurz vorm Ziel, und wäre für Tips sehr dankbar.
Re: Geht doch nicht ohne weiteres...
Ja:stimpy hat geschrieben:1.) Kann ich wirklich davon ausgehen, daß QT alle Widgets aufräumt, die es anzeigt?
QObjects organize themselves in object trees. When you create a QObject with another object as parent, the object will automatically add itself to the parent's children() list. The parent takes ownership of the object i.e. it will automatically delete its children in its destructor.
Du könntest versuchen, die Qt-Sources zusammen mit dem Tracer neu zu compilieren. Sonst ist der für die Qt-internen Vorgänge blind.stimpy hat geschrieben:2.) Was mach ich mit den vermißten Widgets? (Nicht mitverfolgen?, Tracer-Destruktion per Timer verzögern?)
Hmm, verstehe. Ich müßte das QT in der Debug-Version neu compilieren und ihm mein modifiziertes new/delete nebst Tracer unterschieben.
Das ganze muß dann innerhalb von QT und meinem Programm bekannt sein.
Da muß ich erstmal überlegen, was der Linker da so macht, und ob ich da was exportieren muß.
Danke für den Tip.
Das ganze muß dann innerhalb von QT und meinem Programm bekannt sein.
Da muß ich erstmal überlegen, was der Linker da so macht, und ob ich da was exportieren muß.
Danke für den Tip.