Seite 1 von 1

WA_DeleteOnClose

Verfasst: 16. Juni 2018 15:34
von Chri
Hi
Von einem Fenster aus öffne ich mit pushbutton ein anderes Fenster:

Code: Alles auswählen

void MainWindow::on_pushButton_clicked()
{
    Dialog *f = new  Dialog();
    f->show();
}
Wenn ich dann vom 2. Fenster nichts mehr will klicke ich auf den Schließen-Knopf(re oben) und weg ist es.
Damit war ich bisher zufrieden.
Nun ist mir aufgefallen, dass im TaskManger der benutzte Arbeitspeicher dadurch nicht kleiner wird und mit jedem Klick auf den pushbutton immer größer wird. Und dann ist mir in weiterer Folge aufgefallen, dass der Destruktor des 2. Fensters gar nicht aufgerufen wird.
Ok. Gegoogelt, Lösung gefunden:
this->setAttribute(Qt::WA_DeleteOnClose); im Konstruktor.

Sollte man immer prinzipiell in jeden Konstruktor diese Zeile setzen?

(Bin jetzt nur ein bisschen verunsichert, weil die Sache schon bedeutend ist, trotzdem hört man (ich) nie davon.
Warum schreibt der QT-Designer nicht automatisch selbst diese Zeile hin?
)

LG
Chri

Re: WA_DeleteOnClose

Verfasst: 17. Juni 2018 09:21
von Volker75
gelöscht, da falsch. Richtige Antwort folgt.

Re: WA_DeleteOnClose

Verfasst: 17. Juni 2018 13:33
von Christian81
Du legst ein Objekt an, löscht es nicht - ein klassisches Speicherleck. WA_DeleteOnClose Ist nur ein Hilfskonstrukt. Besser wäre es den Dialog selbst wieder korrekt zu löschen wenn man ihn nicht mehr benötigt.

Re: WA_DeleteOnClose

Verfasst: 19. Juni 2018 09:06
von helmut.jakoby
Es gibt meines Wissens mehrere Möglichkeiten:

1. Wenn immer nur der „selbe“ Dialog aufgerufen werden soll, also als Zeigerattribut des MainWindow vorhanden ist, kann der Zeiger auf das MainWindow im ctor des Dialogs übergeben werden und der Dialog wird mit dem MainWindow aus dem Speicher entfernt.

2. Alternativ kann das MainWindow dieses auch im eigenen dtor erledigen.

3. Oder wie schon beschrieben mit ‚Qt::WA_DeleteOnClose‘; der Dialog wird nach dem Schließen aus dem Speicher entfernt (ggf. sinnvoll wenn nichtmodal).

4. Wenn man den Dialog selber löschen möchte, wenn er nicht mehr gebraucht wird, kann man diesen auch auf dem Stack anlegen (modal).

5. Oder man fängt das Signal ‚finished‘ vom Dialog und löscht diesen dann (wenn im Heap).

6. Und …

Hauptsache der Dialog verschwindet wieder aus dem Speicher.

Gruß Helmut