New / Delete Frage

toxrocks

Grünschnabel
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:
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:
delete KonfiguratorMainWindowImpl::entry;

Falls man das überhaupt dürfte.
 
Wo ist denn entry definiert? Wenn es eine public Membervariable von KonfiguratorMainWindowImpl ist dann kannst Du es mit
Code:
delete KonfiguratorMainWindowImpl.entry
löschen.
Besser wäre allerdings, wenn entry private oder protected definiert wäre. Dann wurde ich eine Memberfunktion schreiben wie:
Code:
KonfiguratorMainWindowImpl:: DestroyEntry()
       {
         delete entry;
       }
P.S.: Das Leerzeichen vor DestroyEntry ist nur da, weil Doppelpunkt und D in :-) umgewandelt wird. Im Code soll da kein Leerzeichen sein!
 
Weil es ja sein könnte, dass jemand das Hauptfenster schliesst, ohne ein DialogFenster geöffnet zu haben & dann kann er nichts löschen, weil ja keine Instanz dessen geschaffen wurde, ergo Fehlermeldung.
Und was ist, wenn er 5 Fenster geöffnet hat? Dann gibt es doch auch 5 Instanzen davon, aber durch den Destruktor wird nur eine Instanz (die letzte) gelöscht, oder?

Gruß, Notwist
 
Ich denke, sobald das Hauptfenster geschlossen wird, wird der Destruktor der Klasse aufgerufen (einmal). Kann man auch mit einer QMessageBox-Nachricht überprüfen. Hätte ich eine Instanz mit

Klasse instanz;

initialisiert, wird der Speicher ja automatisch nach Methodenende freigegeben, was man mit new ja gerade verhindern will. Dies muss man dann auch per Hand mit delete machen.

Weiss aber eben nicht, wie ich in der anderen Klasse auf diese Instanz mit delete zugreifen soll. Muss ich diese Instanz extra in die neue Klasse übergeben, um es löschen zu können? Also nen Pointer darauf?

Gruß, Toxrocks
 
Zurück