Seite 1 von 1

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

Verfasst: 12. März 2010 15:16
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

Verfasst: 12. März 2010 15:58
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?

Verfasst: 12. März 2010 16:02
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 ;)

Verfasst: 12. März 2010 16:23
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.

Verfasst: 12. März 2010 17:05
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).

Verfasst: 12. März 2010 17:12
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.

Verfasst: 12. März 2010 17:26
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.