[gelöst] Anfängerfrage: Wann delete aufrufen?

Alles rund um die Programmierung mit Qt
Antworten
Wowbagger
Beiträge: 17
Registriert: 14. Juli 2007 21:12

[gelöst] Anfängerfrage: Wann delete aufrufen?

Beitrag von Wowbagger »

Hallo,

ich habe eine Anwendung, in der über einen Menüpunkt ein Fenster geöffnet wird.

Code: Alles auswählen

 QTableView* tv = new QTableView();
 tv->show();
Das Fenster bleibt so lange auf, bis es der Benutzer schließt. Meine Frage: wann und wo rufe ich am Besten

Code: Alles auswählen

 delete tv;
auf?

Es kann ja auch sein, daß das Fenster aus dem tv aufgerufen wurde nicht mehr existiert.

Vielen Dank!

Wowbagger
Zuletzt geändert von Wowbagger am 12. März 2010 17:27, insgesamt 1-mal geändert.
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

Erstens: Diese Frage gehört in das Unterforum "C++ Grundlagen".

Prinzipiell ruft man das delete auf, wenn ein Objekt nicht mehr benötigt wird. Spätestens im Destruktor des Parent-Objektes.

Um sicher zu gehen, fragt man ab, ob das Objekt noch existiert:

Code: Alles auswählen

if myObject
{
   delete myObject;
}
Generelle Frage:
Warum arbeitest Du überhaupt mit new?
Linux, das längste Text-Adventure aller Zeiten
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

RavenIV hat geschrieben:Um sicher zu gehen, fragt man ab, ob das Objekt noch existiert:

Code: Alles auswählen

if myObject
{
   delete myObject;
}
Damit fragst du nur ab, ob dein Pointer irgendwo hin zeigt, das hat mit dem Objekt erstmal nichts zu tun.
Und die Abfrage ist auch überflüssig, da man problemlos delete 0 aufrufen kann. Wichtiger ist eher, den Pointer hinterher auf 0 zu setzen ;)
Wowbagger
Beiträge: 17
Registriert: 14. Juli 2007 21:12

Beitrag von Wowbagger »

RavenIV hat geschrieben:Generelle Frage:
Warum arbeitest Du überhaupt mit new?
Damit ich den Zeitpunkt der Zerstörung des Objektes selbst bestimmen kann.

Ich konstruiere mal ein Beispiel um die Frage deutlicher zu machen:

Aus dem Hauptfenster kann ich ein Suchformular aufrufen. Darin werden die Suchkriterien eingegeben und schließlich die Ergebnisliste angezeigt. Für jeden Datensatz in der Ergebnisliste kann ich durch einen Doppelklick eine Detailformular anzeigen. Mehrere Detailformulare sollen gleichzeitig offen sein. Wird das Suchformular geschlossen, bleiben alle Detailformular geöffnet.

Wie würde ich vorgehen?

Die Detailformulare müssen in einem Controller außerhalb des Suchformulars erzeugt werden. Im Controller habe ich eine Liste mit Pointern auf die Detailformulare. Nur: wie kann der Controller den Speicherbereich freigeben, wenn der Benutzer ein Detailformular schließt? Ich will das ja nicht erst im Destruktor des Controllers machen. Der bleibt ja am Leben solange die Anwendung läuft und zwischenzeitlich kann der Benutzer ja 1000 Detailformular geöffnet und wieder geschlossen haben.
TSS
Beiträge: 73
Registriert: 24. November 2009 15:40
Kontaktdaten:

Beitrag von TSS »

Das hört sich so an, als wäre das Flag Qt::WA_DeleteOnClose eine Möglichkeit. Wenn ich das richtig verstanden habe, soll ja genau das geschehen. Wenn das Fenster geschlossen wird, dann soll es auch gelöscht werden (bei erneutem Aufruf kann es ja ggf. neu angelegt werden).
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

So in der Richtung wollte ich auch was schreiben.
Es gibt nämlich die Möglichkeit (meiner Meinung nach der Normalfall), dass sich das Fenster selber deleted, wenn es geschlossen wird.
Linux, das längste Text-Adventure aller Zeiten
Wowbagger
Beiträge: 17
Registriert: 14. Juli 2007 21:12

Beitrag von Wowbagger »

Cool. Danke. Genau sowas habe ich gesucht. Dann kann ich mir die Pointerliste und den Controller sparen.

Und damit ist das Thema bei "Qt Programmierung" doch gut aufgehoben. :-)

Gruß,
Wowbagger.
Antworten