Seite 1 von 1

memory leaks - Speicherlöcher finden

Verfasst: 23. Juni 2006 09:50
von stimpy
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

Verfasst: 23. Juni 2006 10:28
von Christian81
Funktionieren tut es - das ist die normale Vorgehensweise.
Unter Linux würde ich allerdings einfach valgrind dafür benutzen.

Freu!

Verfasst: 23. Juni 2006 10:46
von stimpy
Danke!

Das freut mich. Ich brauche was, das mit PC & Mac funktioniert.

Geht doch nicht ohne weiteres...

Verfasst: 23. Juni 2006 15:19
von stimpy
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.

Re: Geht doch nicht ohne weiteres...

Verfasst: 23. Juni 2006 15:57
von OscarWild
stimpy hat geschrieben:1.) Kann ich wirklich davon ausgehen, daß QT alle Widgets aufräumt, die es anzeigt?
Ja:
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.
stimpy hat geschrieben:2.) Was mach ich mit den vermißten Widgets? (Nicht mitverfolgen?, Tracer-Destruktion per Timer verzögern?)
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.

Verfasst: 23. Juni 2006 16:39
von stimpy
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.