Avatar billede x4all_dk Nybegynder
15. marts 2006 - 13:02 Der er 6 kommentarer og
3 løsninger

Free integers og reals

Jeg har et problem med mit overforbrug at memory.

Skal jeg free vars som er defineret i en funktion ?

såsom: Integer, String, Real osv.. ?

Hvis ja... hvordan !?
Avatar billede arne_v Ekspert
15. marts 2006 - 13:09 #1
du skal kun free det som der er new'et
Avatar billede x4all_dk Nybegynder
15. marts 2006 - 13:23 #2
Newet = Created ?

Rydder den automatisk op efter funktionen forlades så ?
Avatar billede arne_v Ekspert
15. marts 2006 - 13:28 #3
nej

new'et = brug af new på pointer

lokale variable deallokers automatisk når de går ud af scope

globaler variable deallokeres ved program exit
Avatar billede tolderlund Nybegynder
15. marts 2006 - 14:26 #4
For at gøre det mere klart:

De variabler/objekter som du selv creater i din KODE skal du også selv sørge for at destroye.
Eksempel:
var
  sl: TStringList;
begin
  sl := TStringList.Create;  // Her creater vi selv et objekt
  try
  ..
  finally
    sl.Free;  // Så skal vi huske Free af objektet til sidst.
  end;
end;

De variabler som du blot skriver i VAR sørger Delphi for automatisk at rydde op.
Eksempel:
var
  I: Integer;
  S: string;
begin

// Delphi oprydder automatisk I og S.
end;
Avatar billede hrc Mester
16. marts 2006 - 09:25 #5
Alt hvad der ligner klasser (strenge er desværre en undtagelse) skal frigives da de oprettes globalt (mener det kaldes at oprette på "heapen").

Hvis du laver en TStringList i en procedure, så er den ikke påvirket af procedurens "scope". Det betyder intet at din variabel er erklæret derinde, såddan som i Tolderlunds eksempel.

Vigtigt: Brug try-finally så konsekvent som muligt.

En anden mulighed for overforbrug af ram er hvis dine "forms" (vinduer) er oprettet automatisk. Delphi har en indstilling som opretter alle dine forme automatisk. Virkelig noget lort når man har mange forme for det fylder. Denne indstilling er desværre default.
Har tit stødt på at formen er oprettet men at når de skal vises, så oprettes programmøren dem endnu en gang => Stort spild af hukommelse.
Når så formen lukkes igen, så glemmer samme programmør tit også at frigive det => Endnu større spild af hukommelse.

I Delphi 2006 SKAL du slå det fra i: Tools, Options, Environment options, VCL-designer. Fjern fluebenet i "Auto create forms & datamodules".

Den rigtige måde er at oprette og lukke i en try finally:

procedure VisForm()
var
  frmMyData : TfrmMyData;
begin
  frmMyData := TfrmMyData.Create(self);
  try
    if frmMyData.ShowModal = mrOK then
    begin
    end;
  finally
    frmMyData.Free;
  end;
end;

Alternativt kan man, i TfrmMyData.OnClose-eventet, skrive "Action := caFree". Derved frigives formen automatisk når den lukkes. Ikke kønt men kan have sin berettigelse eksempelvis ved about-forme:

procedure VisForm();
var
  frmMyData : TfrmMyData;
begin
  frmMyData := TfrmMyData.Create(self);
  if frmMyData.ShowModal = mrOK then
  begin
  end;
end;

En kort og nørdet version af samme er i øvrigt:

begin
  if TfrmMyData.Create(self).ShowModal = mrOK then
  begin
  end;
end;
Avatar billede hrc Mester
16. marts 2006 - 09:28 #6
Et andet sted hvor man bruger "Action := caFree" er i MDI-applikationer (Word og Excel har været eksempler på MDI-programmer) hvor MDI-childs må lukkes på den måde.
Avatar billede hrc Mester
16. marts 2006 - 09:38 #7
I forbindelse med de autooprettede vinduer glemte jeg at fortælle, at i eksisterende projekter, skal du huske at fjerne dem fra projektets options-menu: Project, Options, Forms. Her klikker du forme over i den højre listboks så de skal oprettes manuelt. Undtaget er din mainform og eventuelt også datamoduler.
Avatar billede x4all_dk Nybegynder
18. marts 2006 - 16:34 #8
Tak for alle de gode svar.

Jeg giver jer alle tre point, så Arne_v smid et svar hvis du vil have del af kagen!
Avatar billede arne_v Ekspert
18. marts 2006 - 20:34 #9
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester