Avatar billede j-johansen Nybegynder
26. maj 2006 - 15:38 Der er 10 kommentarer

Memory leak?

Jeg har siddet og lavet et program der (i en tråd) looper igennem noget data og putter det ind i et array.
Når den har loopet igennem, f.eks. 100 gange putter den dataen ind i en database, assigned nil til arrayet og gør arrayet klar på ny med setlength.

Problemet er bare at efter noget tid bruger programmet, hvis jeg kigger i job-listen, utroligt meget virtuel hukommelse (VM-størrelse kolonnen i joblisten)...

VM-størrelsen bliver heller ikke mindre efter tråden er færdig...

Jeg har prøvet med MemCheck, men den finder ikke noget...

Skal man fjerne data fra arrayet på en anden måde og/eller er der et andet værktøj jeg kan bruge til at finde fejlen?
Avatar billede vallemanden Nybegynder
26. maj 2006 - 21:21 #1
hvilken Delphi version bruger du?
Avatar billede j-johansen Nybegynder
26. maj 2006 - 21:32 #2
Delphi 6 Personal
Avatar billede nico26 Nybegynder
26. maj 2006 - 23:42 #3
kan du ikke vise lidt kode?
Avatar billede j-johansen Nybegynder
27. maj 2006 - 00:21 #4
Basically er det det her:


type
  StringArray = Array of String;
  CstmRec2 = Record
    s1: String;
    i1, i2: Integer;
  end;
  CstmRec = Record
    s1, s2, s3, s4: String;
    aos: ArrayOfString;
    i1, i2, i3, i4, i5, i6, i7: Int64;
    cstmA: Array of CstmRec2;
  end;
  FArray: Array of CstmRec;

Create(tager nogle parametrer)
inherited Create;
SetLength(FArray, 100);



Destroy
FArray := nil;
inherited Destroy;



Nogle funktioner der tager strings som parametrer og returner StringArray...
Nogle funktioner der tager strings som parametrer og returner String
Nogle procedurer der tager var parametrer


AddD
Kalder nogle funktioner og procedurer
Lægger parametrer ind i FArray, sender det videre til AddD2

AddD2
  for i:=0 to FValues-1 do begin
    // Smækker det ind i databasen
    Finalize(FArray[i]);
    SetLength(FArray[i].cstmA, 0);
    FArray[i].cstmA := nil;
  end;

  SetLength(FArray, 0);
  FArray := nil;¨
  // Gør den klar igen...
  SetLength(FArray, 100);
Avatar billede j-johansen Nybegynder
27. maj 2006 - 00:24 #5
(Det hele er i en class som bliver create'ed i en tråds execute og FreeAndNil'ed i trådens Destroy...)
(
Tråden er startet sådan her:
      with Traad.Create(true, (andre parametrer)) do begin
        FreeOnTerminate := true;
        resume;
      end;
)
Avatar billede j-johansen Nybegynder
27. maj 2006 - 01:12 #7
Som jeg skrev i spørgsmålet ("Jeg har prøvet med MemCheck, men den finder ikke noget...") har jeg allerede prøvet det, uden held...

Det virker som om at den selv free'er al den brugte memory og virtuelle memory når programmet lukkes...
Avatar billede nico26 Nybegynder
27. maj 2006 - 11:09 #8
SetLength(FArray[i].cstmA, 0);
FArray[i].cstmA := nil;

du kalder vist SetLength på en record
prøv

Dispose(FArray[i].cstmA);
FArray[i].cstmA := nil;
Avatar billede j-johansen Nybegynder
27. maj 2006 - 12:31 #9
Har nu selv fundet fejlen... Havde lavet et kald til databasen, og dernæst free'd resultatet i et if som kun var sandt halvdelen af gangene... :$

Mht. at free'e en dynamisk array har lidt testing vist at alt det jeg har læst rundt omkring på nettet er rigtigt... Man skal bare sige ":= nil;" :)

Men jeg vile stadigt gerne have fingrer i et program der kunne "analyserer" ens program (eller sådan noget) og finde leaks... Hvis der er nogen der kender sådan et (som virker og jeg kan finde ud af at bruge :s) så er der stadig 60 points "på højkant" :)
Avatar billede hrc Mester
30. maj 2006 - 22:14 #10
Det eneste jeg har stødt på er hedgangne TurboPowers MemorySleuth som jeg desværre ikke længere har en kopi af. Det virkede faktisk omend det ikke var let at bruge.

Måske er der noget hjælp at hente hos Madshi: http://www.madshi.net. Har ikke helt fået testet de MadCollection'en som han har lavet, men der er måske noget. Det ser meget homogent ud.
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