[gelöst] new / delete

Alles rund um die Programmierung mit Qt
Antworten
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

[gelöst] new / delete

Beitrag 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

Code: Alles auswählen

delete KonfiguratorMainWindowImpl::entry;
Falls man das überhaupt dürfte.
Gruß, Notwist
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Also normal löscht Qt alles selber, wenn es nicht mehr gebrucht wird.
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag 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?
Gruß, Notwist
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag 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
atlastraeger
Beiträge: 32
Registriert: 11. August 2004 12:42

Beitrag 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.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag 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 :D

Goos
atlastraeger
Beiträge: 32
Registriert: 11. August 2004 12:42

Beitrag von atlastraeger »

okay, dann kann er entry aber auch in einer memberroutine von KonfiguratorMainWindowImpl delete-n.
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag 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!
Gruß, Notwist
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag 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
Notwist
Beiträge: 85
Registriert: 2. März 2005 14:24

Beitrag 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.
Gruß, Notwist
Antworten