Hallo,
werden lokale Objekte beim Verlassen der Routine eigentlich automatisch freigegeben oder muss das explizit über die entsprechenden Destruktoren erfolgen ?
Roger
Hallo,
werden lokale Objekte beim Verlassen der Routine eigentlich automatisch freigegeben oder muss das explizit über die entsprechenden Destruktoren erfolgen ?
Roger
Hi Roger,
soweit ich weiß, werden lokale Objekte nicht automatisch freigegeben. (zumindest, wenn man sich die Beispiele zum Thema TStrings o.ä. anschaut)
Ist auch logisch, da sie ja auch nicht automatisch aloziiert werden.
Gruß, Steffen
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Servus Roger,
wenn Dein Objekt „jemandem gehört“, dann wird das Objekt freigegeben, wenn der Eigentümer freigegeben wird. (z.B. Edit auf einem Formular -> Edit wird freigegeben wenn Formular freigegeben wird.)
Wenn Dein lokales Objekt nun keinem gehört, musst du es selber freigeben.
Sieh Dir vielleicht mal in der Online-Hilfe die Eigenschaft „Owner“ an.
Grüsse Wolfgang
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hi,
werden lokale Objekte beim Verlassen der Routine eigentlich
automatisch freigegeben
Nein!
oder muss das explizit über die entsprechenden Destruktoren erfolgen ?
Ja!
Daß dem so ist, kannst Du ganz leicht überprüfen. Leg ein neues Projekt an und deklariere in der Unit1 eine globale Variable „VAR L: TLabel“ (steht also unter „IMPLEMENTATION“).
Füge dem Code die Prozedur
PROCEDURE ErzeugeNeuesLabel;
VAR Lab: TLabel;
begin
Lab := TLabel.Create(Form1);
WITH Lab DO
begin
Parent := Form1;
Caption := 'Ich bin ein Label!';
Top := 30;
Left := 30;
Color := clBlue
end;
(\* Vor Ungültigwerden von Lab beim Verlassen der Prozedur \*)
(\* lokalen Zeiger Lab in globalen Zeiger L kopieren! \*)
L := Lab
end;
hinzu (ist keine Methode von Form1), die Du im Eventhandler „FormCreate“ aufrufst.
Dann brauchst Du nur noch z. B. den Eventhandler FormMouseDown zu erzeugen und folgendes rein schreiben:
WITH L DO
begin
Top := 30+Random(120);
Left := 30+Random(120);
Color := Random($FFFFFF)
end
Das Funktionieren der Geschichte zeigt, daß beim Verlassen der Prozudur „ErzeugeNeuesLabel“ nur der Zeiger Lab ungültig wird (Stackpointer geht 4 runter), der Speicherbereich auf dem Heap, der die Daten des Labels enthält, jedoch unangetastet bleibt.
Gruß
Martin
Objekte werden freigegeben, wenn der Owner (NICHT der Parent) freigegeben wird, unabhängig davon wie das Objekt erstellt wurde.
Edit auf Form: Form ist Parent, muss aber nicht notwendigerweise der Owner sein…
Soweit ich weiß, ging es um OBJEKTE (TObject), nicht Komponenten (TComponent)!
Jaja, OOP ist schon schwer…
Gruß, Steffen
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
upsala…
wobei ja implizit das gleiche ausgesagt wäre…Ohne Owner keine Freigabe…