Wenn Fenster geschlossen wird Zeiger auf Fenster löschen, aber wo ???
-
hi,
ich habe 2 units.
in unit1 include ich unit2 und mach sie somit verfügbar.
nun hab ich in form1 einen button und wenn ich auf denn klicke soll das fenster der unit 2 dynamisch im speicher angelegt werden ala:TFrame2* Frame2 = new TFrame2(this);
sprich ich habe einen zeiger von Typ TFrame auf dem Speicher reserviert.
Nun gut also geht das Fenster auf, und jetzt komme ich endlich zu meiner Frage, wo muss ich denn denn Zeiger löschen ?
Kann ich das bei Unit2 bei Form2::FormDestroy ala delete Form2; eintragen oder wo muss ich das machen ????
danke
-
wozu den zeiger löschen???
wenn du form2 schließt, wird der speicher automatisch freigegeben
-
bist du dir 100% sicher ?
ich erzeuge doch in unit1 mittels des new Operators doch einen Zeiger TForm2.
Soweit ich weis muss ich Zeiger dich ich mit new erzeuge auch immer löschen, oder etwa doch nicht ???ich dachte ich müsste ihrgendwie onClose oder so denn speicher wieder freigeben ...
-
es ist richtig, dass du mit new eine neue inztanz von TFrame erzeugst, nur wenn du die form mit Close() schließt, wird automatisch der destruktor aufgerufen der somit den speicher wieder freigibt
-
hallo,
also du kannst deshalb ganz sicher sein weil
TFrame2* Frame2 = new TFrame2(this);
ein Formular seine Elemente automatisch freigibt, mit new TFrame2(this); machst du TFrame2 zum Element von this, das wahrscheinlich ein Formular ist.
jeden Button den du auf dein Formular legst gibst du ja beim Programmende auch nicht händisch wieder frei, das macht auch der Owner, also das Formular, und TFrame2 macht das Object zu seinem Owner das im Konstruktor übergeben wird, somit ist der Owner für die Freigabe zuständig...mfg
murphy
-
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; }
-
Ok, muss es also nicht freigeben, das ist gut.
An welcher stelle sollte man beim öffnen eines Fensters eigentlich so eine Art Popup einbinden.sprich form1 macht form2 auf und form2 soll aber zuerst form3 modular anzeigen.
Soll ich das Fenster dann am besten bei OnActivate oder OnShow aufmachen ????danke
-
Das mit dem "Selbszerstören" bzw. dem automaisch aufgerufenen destruktor stimmt meines Wissen nach. Das Form und der zugehörige speicher wird beim schließen automatisch freigegebn.
Aber Voricht!
Der Zeicher auf deinen Form verweiss nun auf einen vielleicht schon von etwas anderem belegten Speicher, bzw. auf ein nicht mehr existierendes Objekt. Beim
versehentlichen Aufruf/Zugriff durch den Zeiger bekommst du eine Exception.
Du musst also nach dem Löschen den Zeiger auf "NULL" setzen"Also einfach stets Folgendes im Hinterkopf behalten:
{
TypXY *meinzeiger = NULL; // auf NULL setzen
meinzeiger = new TypX(..);
if(meinzeiger != NULL) // test ob speicher allokiert wurde
->Zugriff // erst dann Zugreifen}
void delete_objekt(..)
{
delete meinziger; // gleichzusetzen mit Close() beim Form
meinzeiger = NULL;
}Sieht umständlich aus, ist aber unglaublich wichtig.
Den den Zugriff auf einen falsch allokierten Zeiger bzw. einen Zeiger auf ein bereits gelöschtes Objekt im Quellcode ausfindig zu machen(wenn man dann schon die Exception kassiert hat) ist sehr schwer und Zeitaufwendig.ich hoffe, konnt dir ein bisschen weiterhelfen