Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Variable nur für eine Procedure erstellen


Nano-Ware - Mo 07.12.09 13:09
Titel: Variable nur für eine Procedure erstellen
Wenn ich eine Varable/Komponente nur für eine Procedure, also z.B.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TMainForm.FormCreate(Sender: TObject);
var
  lista: TListItem;
begin
  ...  
end;

wird diese dann wieder aus dem Arbeitsspeicher entfernt, nachdem die Procedure beendet worden ist?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Narses - Mo 07.12.09 13:29

Moin und :welcome: im Forum!

user profile iconNano-Ware hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich eine Varable/Komponente nur für eine Procedure, also z.B.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TMainForm.FormCreate(Sender: TObject);
var
  lista: TListItem;
begin
  ...  
end;

wird diese dann wieder aus dem Arbeitsspeicher entfernt, nachdem die Procedure beendet worden ist?
Jain. ;)

Lokale Variablen sind nur innerhalb der Prozedur/Funktion/Methode gültig, das ist schon richtig. Allerdings ist deine "Variable" ein Zeiger auf ein Objekt, das sich auf dem Heap befindet. Dieser Speicherplatz wird nicht automatisch freigegeben. Deshalb macht man üblicherweise einen Resourcenschutzblock um so eine Konstruktion:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TMainForm.FormCreate(Sender: TObject);
var
  List: TListItem;
begin
  List := TList.Create; // Objekt anlegen
  try // was auch immer hin drin passiert, ...
    ...
  finally // am Ende auf jeden Fall:
    List.Free; // freigeben!
  end;
end;
Weiterhin ist bei einer TList zu beachten, dass deren "Inhalte" (sind ja nur Zeiger) beim Freigeben des Objekts nicht mit freigegeben werden (wenn du z.B. auf records zeigst). :idea:

cu
Narses


Nano-Ware - Mo 07.12.09 13:50

Ok danke, das hat geholfen^^