Seite 1 von 1
[gelöst] new / delete
Verfasst: 19. April 2005 12:54
von Notwist
Wenn ich ein Objekt mit new allokiere, weil ich dieses Objekt (mein Fenster) länger brauche, als die Laufzeit der Methode, in der es gemacht wird, wie kann ich das Objekt dann mit delete löschen, wenn ich es in der neuen Klasse löschen will, in der es ja am längsten gebraucht wird. Sprich, so lange er Methoden in der neuen Klasse ausführt, so lange braucht er das Objekt und erst dann kann er es löschen. In der neuen Klasse kennt er das Objekt aber ja garnicht, weswegen ich es mit delete() nicht ansprechen kann.
Code: Alles auswählen
void KonfiguratorMainWindowImpl::slot_newEntry()
{
entry = new AddIdentifierFormImpl(&giver);
entry->startIdEntryDialog();
// delete entry; // geht nicht, da Fenster dann geschlossen wird & er in startIdEntryDialog() aus AddIdentifierFormImpl noch arbeitet
}
In AddIdentifierFormImpl kann ich an der Stelle, in der entry gelöscht werden dürfte, dieses nicht ansprechen, auch nicht mit
Falls man das überhaupt dürfte.
Verfasst: 21. April 2005 08:47
von FlorianBecker
Also normal löscht Qt alles selber, wenn es nicht mehr gebrucht wird.
Verfasst: 21. April 2005 09:08
von Notwist
Auch die mit new erstellten Sachen? Das ist doch extra dafür da, dass man per Hand den Speicher reserviert. Und das sollte man dann doch auch per Hand wieder frei machen. Kann aber ja sein, dass Qt das vielleicht nach Programmende tut. Habe aber das Gefühl, wenn ich den Taskmanager im Auge behalte und das Programm 30mal gebracuht habe, am Ende des Schließens immer mehr Speicher besetzt ist.
Weiss jemand mehr?
Verfasst: 21. April 2005 10:38
von Goos
Geloescht wird von selbst nur alles was auch ein QObject ist, also so ueber den Daumen alles was man in der Oberflaeche sehen kann.
Da wird aufgeraeumt, sobald das Parent-Element zerstoert wird.
Siehe auch ->
http://doc.trolltech.com/3.3/objecttrees.html
In der Regel ists aber besser auch da das delete selbst zu machen, so vergisst man wenigstens nichts
Goos
Verfasst: 21. April 2005 11:05
von atlastraeger
Erstelle entry als Membervariable der Klasse. Dann hast Du in allen Methoden Zugriff darauf und kannst entry löschen, wann Du möchtest.
Verfasst: 21. April 2005 11:31
von Goos
atlastraeger hat geschrieben:Erstelle entry als Membervariable der Klasse. Dann hast Du in allen Methoden Zugriff darauf und kannst entry löschen, wann Du möchtest.
Hat er doch gemacht, man siehts nur der schlechten Benamung wegen nicht so gut
Goos
Verfasst: 21. April 2005 11:33
von atlastraeger
okay, dann kann er entry aber auch in einer memberroutine von KonfiguratorMainWindowImpl delete-n.
Verfasst: 21. April 2005 11:55
von Notwist
Also, die Instanz entry ist ja dafür da, das AddIdentifierFormImpl-Fenster zu erstellen. Da ich die Methode, in der es geschaffen wird, aber schon verlasse, bevor das Fenster mit OK geschlossen wird, muss es natürlich länger bestehen, als es würde, wenn ich es nicht mit new erschaffe. Der Zeitpunkt, an dem ich es schliessen kann, wird in den Methoden von AddIdentifierFormImpl bestimmt. Weiss halt nur nicht, wie ich AddIdentifierFormImpl den Bezug zu entry aus KonfiguratorMainWindowImpl geben kann, um es in AddIdentifierFormImpl mit
delete entry;
zu löschen!
Verfasst: 3. Mai 2005 19:00
von ArneStocker
vielleicht habe ich was nicht richtig verstanden, aber mir sieht das so aus, als wolltest Du ein Objekt vom Typ "AddIdentifierFormImpl" zu irgendeinem beliebigen Zeitpunkt vollständig löschen (z.B. wenn der Dialog - das ist es doch ??? - geschlossen wird).
Du kannst AddIdentifierFormImpl::close(true) aufrufen, z.B. wenn auf einen Button geklickt wird, das führt dann dazu dass das Objekt vollständig abgeräumt wird. Du kannst auch auf das Close Ereignis beim Schliessen des Fensters reagieren und dann selbst close(true) aufrufen. Standart ist close(false), d.h. das Objekt bleibt bestehen und wird lediglich nicht mehr dargestellt.
Wenn Du nur ein Objekt (Dialog ?) erzeugen willst, kannst du auch eine statische Membervariable m_pEntry definieren, auf die Du dann (am besten durch eine Methode gekappselt) zugreifen kannst.
Code: Alles auswählen
KonfiguratorMainWindowImpl::CloseDialog()
{
delete m_pEntry;
m_pEntry = NULL;
}
Allerdings solltest Du diese Methode nicht(!) aus dem Dialog "AddIdentifierFormImpl" heraus aufrufen, ist auch nicht nötig s.o.
Gruss Arne
Verfasst: 3. Mai 2005 20:27
von Notwist
Danke für die Antworten. Ich hatte einen dummen Fehler drin. Hatte das Fenster mit show() und nicht exec() sichtbar gemacht, was bewirkte, dass eben nicht in der Klasse gewartet wurde, in der es erstellt wurde, bis die Instanz (Fenster) geschlossen wurde. So konnte ich dann den new-Befehl umgehen und die Instanz löscht sich ja dann mit dem Schliessen des Fensters automatisch.
Sorry, dass ich vergessen hatte, das zu posten.