Einzelnen Beitrag anzeigen

Benutzerbild von Niels14
Niels14

Registriert seit: 28. Dez 2005
Ort: Sydney/Australien
18 Beiträge
 
Delphi XE4 Enterprise
 
#1

Memory Leak bei rekursiven Aufruf...

  Alt 1. Nov 2007, 02:54
Hallo, ich fuehre in unserer ISAPI eine rekursive Suche in der Datenbank nach den Vorfahren von eines mir angegebenen Tiers durch.
Bei dem rekursiven Procedur Aufruf gebe ich ein TStrings Object mit, was meines Wissens nach ja nur eine Referenz auf das TString Object ist. Das TString Objekt wird nur einmal am Anfang erstellt und dann in der Funktion mitgegeben. Er erkennt den Anfang dadurch dass ich einen leeres (NIL) TString Object mitliefere. Die Web Application laeuft einwandfrei unter IIS 6.0. Aber nach der mehrmaligen Suche ist mir aufgefallen dass der Server unmengen an Speicher alloziert hat und nach dem Programm Lauf nicht mehr freigibt. Erst wenn ich den IIS resette habe ich wieder 800 MB mehr speicher! Beim Programmlauf selber wird der Speicher auch verbraucht.
Wo habe ich hier den Denkfehler?

Delphi-Quellcode:
procedure XXX.InbreedCheck(CheckAnimalsKey: String; PedigreeList: TStrings);
var
    StartNode: Boolean;
    AnimalList: TStrings;
    SireKey, DamKey, s, TempStr: String;
begin
    If PedigreeList = nil then
    begin
        StartNode := True;
        AnimalList := TStringlist.create;
        ...
    end
    else
    begin
        StartNode := False;
        ... Hole Daten fuer SireKey und DamKey
    end;

    TempStr := CheckAnimalsKey + '|';

    If SireKey <> 'then
    begin
        TempStr := TempStr + SireKey + '|';
        If pos(SireKey, AnimalList.GetText) > 0 then
            SireKey := '';
    end
    else
        TempStr := TempStr + '|';

    If DamKey <> 'then
    begin
        TempStr := TempStr + DamKey + '|';
        If pos(DamKey, AnimalList.GetText) > 0 then
            DamKey := '';
    end
    else
        TempStr := TempStr + '|';

    AnimalList.add(TempStr);

//Hier startet jetzt die rekursive Suche!
    If (SireKey <> '') then
        InbreedCheck(SireKey, AnimalList);
    If (DamKey <> '') then
        InbreedCheck(DamKey, AnimalList);

    If StartNode then
    begin
        ...
        AnimalList.free;
        ...
    end;
end;
Niels Maschmeyer
  Mit Zitat antworten Zitat