hakaishi hat geschrieben:Hi! Das mit den Speicherlecks habe ich noch nicht ganz begriffen...
Kannst du mir eine Stelle in meinem Programm zeigen und mir sagen, wie ich das behebe?
Code: Alles auswählen
pos = new QPoint((desktop->width() - frameGeometry().width()) / 2,
(desktop->height() - frameGeometry().height()) / 2);
An der Stelle erzeugst du ein Objekt mit new. Solche Objekte müssen immer von Hand wieder mit delete über den Jordan geschickt werden. Das geschieht bei dir nicht.
pos ist zwar ein Member deiner Klasse. Nach obiger Zeile ist aber das alte Objekt nicht mehr erreichbar und somit nicht mehr löschbar, es dümpelt irgendwo im Speicher rum bis nach Programmende das OS den Speicher säubert.
Da ein resizeEvent() ziemlich oft aufgerufen wird, fällt das besonders ins Gewicht. In dem Fall ist es vor allem unnötig, pos als Member zu deklarieren, und dann auch noch als Pointer! pos ist eine Variable die nur in resizeEvent() für das move() gebraucht wird, so was hat nichts bei den Membervariablen zu suchen!
Insvesondere ist das Konstruieren eine QPoint-Objekts an der STelle unnötig, da es noch eine zweite für dich geeignetere Variante von move() gibt!
Und jetzt schau dir das closeEvent() an, da solltest du zwei potentielle Lecks entdecken. Es ist zwar das Letzte, was dein Programm macht, aber trotzdem.
Allerdings ist das vom Programmiertechnischen doof, das ins closeEvent() zu legen. Das ist typische Destruktorarbeit!
Wobei du auch beachten solltest, dass dein Settings-Objekt nie zerstört wird, und damit auch nie Settings geschrieben werden (hast du dich da noch gar nicht gewundert?) Du brauchst settings nicht als Member, und auch nicht als Pointer!
Das "saubere Beenden" durch den Destruktor kannst du dir auch irgendwo schenkden... Der shutdown schickt allen Programmen das SIGTERM, wenn sie nicht schließen wollen ein SIGKILL (für SIGTERM musst du einen Signal-Handler installieren, SIGKILL kannst du nicht abfangen), da gibt es eh keinen ordnungsgemäßen Destruktor mehr. Wenn du die Settings speichern willst, mach das in einer Methode saveSettings(), die du direkt aufrufst. Es ist dir bei einem shutdown nämlich nicht garantiert, dass dein Programm noch in die nächste Runde der EventLoop kommt, wo dann im closeEvent() die Settings "gespeichert" werden (werden sie ja eh bei dir nicht

).
Du solltest vertieft die Programme aus den Examples anschauen. Bei dir herrscht bei der Programmkonzeption noch ziemliches Chaos
