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?
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;
Und hat mir jemand weitere Information ueber die Speicherverwaltung von ISAPI Application in Verbindung mit IIS? Das wuerde mir wenigstens etwas weiter helfen.
Comment