Avatar billede carstensm Nybegynder
16. juni 2001 - 19:03 Der er 8 kommentarer og
1 løsning

Programmets \"Mem Usage\" i Win2000

Mit program opretter en masse objekter hvilket kan ses i \"Mem Usage\" i
Win2000 Windows Task Manager ved at programmet optager mere plads. MEN
hvorfor bliver programmet ikke tilsvarende mindre når jeg Free\'er objekterne
igen? Kan resourcerne frigives bedre?

Hvor meget lid skal man sætte til \"Mem Usage\" når man tjekker om programmet
\"lækker\" hukommelse? ...og er der en anden måde at tjekke det på?

MVH
Carsten
Avatar billede martinlind Nybegynder
17. juni 2001 - 11:24 #1
Ikke noget, før du har lukket dit program helt, men delphi har en indbygget men. manager, og det er nok den der \"holder\" på din fre\'et men. så du ikke kan se det i windows, det er nok et forsøg på at undgå defragmenteret men. Jeg bruger normalt procedure FreeAndNil() når jeg free\'er.

/Martin
Avatar billede pellelil Nybegynder
17. juni 2001 - 14:16 #2
NT\'s (og i det sammenhæng W2000\'s) TaskManager kan IKKE bruges som et debug-værktøj, og du kan derfor ikke bruge den til af se om der er memory leaks i dit program. Til den formål skal du bruge et værktøj der er beregnet til det formål F.eks. MemProof (http://www.automatedqa.com/products/memproof.asp), eller bedre TurboPower\'s Memory Sleuth (http://www.turbopower.com/products/sleuth/).

Prøv at starte et af dine programmer, rod lidt rund i dine forms og se på memory-forbruget i TaskManageren (jeg sidder her med et af mine progammer og TaskManageren siger næsten 6 MB). Nu minimizer du din applikation og venter lidt (nu siger TaskManageren i mit tilfælde omkring 600 KB) og hvis du igen åbner dit program og kigger på et par forms stiger det måske til 1.5 MB !?.

Dette skyldes at under NT så er programmerne \"flinke\" til at melde overfor taskmanageren når de bruger hukommelse, men de er ikke lige så flinke til at melde de igen frigiver det. MEN når du minimizer en applikation udføre den et specielt API kald der får TaskManageren til at \"refreshe\" din applikations memory forbrug.

Lad mig gentager: Du kan IKKE bruge TaskManageren til at debug\'e en applikation  :-)
Avatar billede pellelil Nybegynder
17. juni 2001 - 14:18 #3
martinlind> Om du bruger Free eller FreeAndNil har i dette sammenhæng ikke noget at sige. Sidstnævnte sætter blot din pointer variable til nil hvilket i visse sammehæng kan rede dig fra at bruge et object som er disposed (så fremt i fald at du huske at undersøge om variablen er brugbar: if Assigned(SomeObject) then SomeObject.DoSomething;).
Avatar billede martinlind Nybegynder
17. juni 2001 - 15:19 #4
pellelil>> det er jeg klar over, det var mere fordi det virker som om han er lidt usikker, og så ville jeg såmænd bare oplyse at jeg brugte FreeAndNil. :)
Avatar billede pellelil Nybegynder
17. juni 2001 - 15:34 #5
martinlin> No hard feelings, jeg er også selv begyndt at bruge FreeAndNil her på det sidste selvom jeg aldrig selv har haft problemer med Free, som jeg vil tilskrive god programmerings tekning ;-)
Avatar billede carstensm Nybegynder
17. juni 2001 - 15:41 #6
Jeg har Delphi4. Kan ikke finde FreeAndNil() - er det en hjemmelavet procedure :
procedure FreeAndNil(var AObject);
begin
  AObject.Free;
  AOBject := nil;
end;
???

Carsten
Avatar billede pellelil Nybegynder
17. juni 2001 - 15:52 #7
Jeg ved ikke om FreeAndNil er i Delphi4, men i Delphi5 finder du den i SysUtils.pas og den ser sådan her ud:
<SNIP>
procedure FreeAndNil(var Obj);
var
  P: TObject;
begin
  P := TObject(Obj);
  TObject(Obj) := nil;  // clear the reference before destroying the object
  P.Free;
end;
</SNIP>
Avatar billede carstensm Nybegynder
17. juni 2001 - 16:00 #8
Må være Delphi5-specifik - og nu også i min Delphi4. Tak.
Avatar billede martinlind Nybegynder
17. juni 2001 - 16:56 #9
pellelil>> lyder rigtigt *S*
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