zur Laufzeit mit new erzeugte Objekte werden nicht zerstört
-
hallo.
ich habe folgendes problem. ich instantiere zur laufzeit bei der erzeugung eines mdi child formulares ein objekt (das objekt wird während der gesamten lebenszeit des formulars benötigt).
in der header datei:class TfMDIChild : public TForm { ... public: // Benutzer-Deklarationen myClass myObject; // ein objekt meiner klasse wird instantiiert ...
erzeugt wird es im konstruktor von fMDIChild
__fastcall TfMDIChild::TfMDIChild(TComponent* Owner) : TForm(Owner) , myObject() { }
das MDIChild erzeuge ich folgendermaßen:
if (fMDIChild == NULL) // sollte das Formular fMDIChild noch { // nicht initialisiert sein fMDIChild = new TfMDIChild(NULL); // wird es initialisiert. } fMDIChild->Show();
es ist kein automatisch erzeugtes formular.
im debug modus kannich sehen das ein objekt erzeugt wird.
(this = adresse1)jetzt kann ich ganz normal mit dem objekt arbeiten und alles tun und lassen was ich will. schliesse ich das fenster, wird es gelöscht.
void __fastcall TfMDIChild::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; fMDIChild = NULL; }
jetzt wird es komisch.
erzeuge ich das formular neu (und damit also das objekt auch), kann ich im degub modus im konstruktor von myObject verfolgen, das ein neues objekt erzeugt wird (this = adresse2)ABER, während der arbeit in dem formular wird immer nur auf das erste objekt zugegriffen, also auf adresse1. ganz klar, da sich das ersten nicht will, und mir zweitens auch immer alles um die ohren fliegt, denn die attribute dieses objektes sind mit speichermüll gefüllt(wie zu erwarten)
das finde ich doch sehr merkwürdig!
ich habe alle smögliche probiert, ich habe auch maldelete[] fMDIChild
mit in das onclose ereignis geschrieben, aber es ändert alles nichts.
es wirk fast so, als wäre fMDIChild ein globales objekt (was es 100 pro nicht ist). ich bin völlig ratlos. die einzige lösung die mir einfällt, ist wirklich ein globales objekt zu erzeugen, aber das stößt mir doch schon recht sauer auf.
hat jemand ne idee wie das passieren kann / was ich falsch gemacht habe?
danke!
-
Hi Clip
Hast Du Probleme mit der MDI- Form oder nur mit myObject?
Ich wuerde myObject als Zeigervariable anlegen.
myObject mit new im CTor- Code erzeugen
myObject im Destructor deleten!
-
Und wenn wir schon dabei sind: Lies in der FAQ mal den Artikel zum Thema Public-Variablen.
-junix
-
DerAltenburger:
nur mit myObject.
alles andere geht prima.
und es geht auch erst ab dem zweiten durchlauf nicht mehr.
-
Der Fehler dürfte wohl in deiner Klasse liegen.
Das die alten Daten noch in der klasse sind, kann auch Zufall sein. Allozierst du Speicher innerhalb der KLasse?
-junix
-
Allozierst du Speicher innerhalb der KLasse?
jaein.
in der klasse ist nur ein container, der natürlich dynamisch anwächst.
-
Und der Container enthält die alten Daten?
-junix
-
nein, der contaner ist ok.
die alten daten sind nicht mehr da.
nur greift das programm halt beim zweiten durchlauf auf das erste objekt zu.
in den attributen steht dann aber nur noch müll.
den container lösche ich immer in destruktor
-
so, ich habe jetzt das objekt mit new im ctor der form erstellt. bei zerstörung der form wird das objekt mit delete gelöscht.
allerdings bleibt das problem in der selben form bestehen.
was kann das nur sein?warum greift das programm immer auf das erste objekt zu, selbst wenn es deleted wurde?
-
ah, ne, sehe gerade das sich etwas unterscheidet.
bei mit dem mit new erstellten objekt wird beim zweiten durchlauf nicht auf die adresse des zweiten zugegriffen.
stattdessen wird hat "this" den wert NULL.
alle attribute haben ebenfalls den wert NULL.
-
Hi Clip
pruefe mal den Inhalt von myObject genau! (nicht this, eventuell beides)
vor und nach new im CTor (Schreib die mal auf)
vor und nach delete in Destructor
Ist der 'Wert' voe delete gleich dem nach new???????
Wenn nicht, ueberschreibt irgendwas Deine Variable!
haste
myClass myObject;
oder
myClass *myObject;//so sollte es seinin public?