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;