|
| Create ... free Fra : Lars Holm Thomsen |
Dato : 07-04-04 21:15 |
|
Hvis jeg har en procedure:
Procedure StringListCreate;
var SL:TStringList;
begin
try
SL:=TStringlist.create;
exit;
finally
SL.free;
end;
end;
....vil stringlisten så blive fjernet fra hukommelsen?
Lars
| |
Tom-Vidar Nilsen (07-04-2004)
| Kommentar Fra : Tom-Vidar Nilsen |
Dato : 07-04-04 21:38 |
|
> Hvis jeg har en procedure:
>
> Procedure StringListCreate;
> var SL:TStringList;
> begin
> try
> SL:=TStringlist.create;
> exit;
> finally
> SL.free;
> end;
> end;
>
> ...vil stringlisten så blive fjernet fra hukommelsen?
Nei.
Exit går ut av proceduren med en gang.
| |
PØLLE (07-04-2004)
| Kommentar Fra : PØLLE |
Dato : 07-04-04 21:41 |
|
Hej Lars
> Hvis jeg har en procedure:
>
> Procedure StringListCreate;
> var SL:TStringList;
> begin
> try
> SL:=TStringlist.create;
> exit;
> finally
> SL.free;
> end;
> end;
>
> ...vil stringlisten så blive fjernet fra hukommelsen?
Hvis "SL:=TStringlist.create" IKKE giver fejl, så forlader du proceduren med
det samme vha. "exit" og SL er stadig i hukommelsen
Hvis "SL:=TStringlist.create" giver fejl, behøver du ikke st skrive
"SL.free" for så er huhommelsen aldrig reserveret p.g.a. fejlen.
Den måde du laver det på er fuld korrekt, du har blot det problem, når du
igen kommer til 'hovedprogrammet', at du ikke ved om SL er oprettet uden du
skal gør nogle test.
Det jeg vil skrive er:
//-----------------
Function StringListCreate: Boolean;
var SL:TStringList;
begin
result := True;
try
SL:=TStringlist.create;
except
result := False;
end;
end;
// FINALLY vil altid blive kaldt også selv om alt går som det skal, hvorimod
EXCEPT kun forekommer, hvis "SL:=TStringlist.create" fejler
// kalder du nu "StringListCreate" kan du umiddelbart kontrollere, om SL er
dannet.
F.eks.
If StringListCreate then ....
PØLLE
| |
Lars Holm Thomsen (07-04-2004)
| Kommentar Fra : Lars Holm Thomsen |
Dato : 07-04-04 21:52 |
|
Tusind tak for de hurtige svar, som til fulde bekræftede min mistanke!
Nu håber jeg, at min "memory leak" bliver rettet - min Swap-fil måtte XP
gøre en del større!
Lars
| |
René Larsen (08-04-2004)
| Kommentar Fra : René Larsen |
Dato : 08-04-04 17:45 |
|
In article <40746145$0$28835$ba624c82@nntp04.dk.telia.net>, Lars Holm
Thomsen wrote:
>
> Hvis jeg har en procedure:
>
> Procedure StringListCreate;
> var SL:TStringList;
> begin
> try
> SL:=TStringlist.create;
> exit;
> finally
> SL.free;
> end;
> end;
>
> ....vil stringlisten så blive fjernet fra hukommelsen?
Ja. 'finally'-delen vil *altid* blive kaldt.
Bemærk dog at du bruger try/finally forkert. Hvis Create fejler, kan du
ikke bruge Free, da destructoren allerede er kaldt. Den korrekte måde
er at skrive:
SL:=TStringlist.create;
try
exit;
finally
SL.free;
end;
Her er et lille program som viser at finally kaldes (lavet i Delphi5):
{$APPTYPE CONSOLE}
type
TMyClass = class
constructor Create;
destructor Destroy; override;
end;
constructor TMyClass.Create;
begin
inherited;
WriteLn('TMyClass.Create');
end;
destructor TMyClass.Destroy;
begin
WriteLn('TMyClass.Destroy');
inherited;
end;
procedure test;
var
MyClass : TMyClass;
begin
MyClass := TMyClass.Create;
try
exit;
finally
MyClass.Free;
end;
end;
begin
test;
end.
Håber det hjalp.
MVH, René
| |
PØLLE (08-04-2004)
| Kommentar Fra : PØLLE |
Dato : 08-04-04 22:13 |
|
Hej René
Lige nogen kommentat til din besvarelse:
> Ja. 'finally'-delen vil *altid* blive kaldt.
Vil jeg godt gi' dig medhold i - meeeen
> Den korrekte måde
> er at skrive:
>
> SL:=TStringlist.create;
> try
> exit;
> finally
> SL.free;
> end;
Jeg kan ikke se, som du har opstillet det, hvad du bruger try .. finally til
her.
Går det galt med "SL:=TStringlist.create" får du en fejlmelding og
proceduren eller functionen forlades øjeblikkeligt.
Det var blot venligt ment for ikke at forvirre Lars med, hvordan try
...finally og try .. except bruges.
PØLLE
| |
René Larsen (09-04-2004)
| Kommentar Fra : René Larsen |
Dato : 09-04-04 10:25 |
|
In article <4075c04c$0$260$edfadb0f@dread16.news.tele.dk>, Pølle wrote:
> From: "PØLLE" <NoName@mail.dk>
>
> Hej René
> >
> > SL:=TStringlist.create;
> > try
> > exit;
> > finally
> > SL.free;
> > end;
> Jeg kan ikke se, som du har opstillet det, hvad du bruger try .. finally til
> her.
Jeg bruger try/finally til at sørge for at Free *altid* kaldes hvis Create
lykkes.
> Går det galt med "SL:=TStringlist.create" får du en fejlmelding og
> proceduren eller functionen forlades øjeblikkeligt.
Det er rigtigt. Lars Holm Thomsen havde "SL:=TStringlist.create" *efter*
'try'. Hvis det gik galt med "SL:=TStringlist.create" ville "SL.free" blive
kaldt uden at SL havde en lovlig værdi.
MVH, René
| |
Casper Hansen (08-04-2004)
| Kommentar Fra : Casper Hansen |
Dato : 08-04-04 23:26 |
|
Free bliver kaldt,
Men muligvis glemmer du at slette de objecter som SL holder på.
Eks:
SL := TStringList.Create;
try
SL.Add(TObject.Create);
finally
SL.Free;
end;
Nu leaker du TObject.
/Casper
"Lars Holm Thomsen" <aslakFJ-ERNtoke@yahoo.dk> wrote in message
news:40746145$0$28835$ba624c82@nntp04.dk.telia.net...
> Hvis jeg har en procedure:
>
> Procedure StringListCreate;
> var SL:TStringList;
> begin
> try
> SL:=TStringlist.create;
> exit;
> finally
> SL.free;
> end;
> end;
>
> ...vil stringlisten så blive fjernet fra hukommelsen?
>
> Lars
>
>
| |
|
|