/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
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
>
>



Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409080
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste