WA_DeleteOnClose

Alles rund um die Programmierung mit Qt
Antworten
Chri
Beiträge: 100
Registriert: 23. Juni 2017 12:32

WA_DeleteOnClose

Beitrag 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
Die Sprache des Technikers ist die Skizze
Volker75
Beiträge: 59
Registriert: 8. April 2009 21:04

Re: WA_DeleteOnClose

Beitrag von Volker75 »

gelöscht, da falsch. Richtige Antwort folgt.
Zuletzt geändert von Volker75 am 17. Juni 2018 13:43, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: WA_DeleteOnClose

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
helmut.jakoby
Beiträge: 19
Registriert: 17. Januar 2012 15:26
Kontaktdaten:

Re: WA_DeleteOnClose

Beitrag 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
Antworten