AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Memory Leak bei rekursiven Aufruf...

Ein Thema von Niels14 · begonnen am 1. Nov 2007 · letzter Beitrag vom 13. Nov 2007
 
Benutzerbild von Niels14
Niels14

Registriert seit: 28. Dez 2005
Ort: Perth/Australien
18 Beiträge
 
Delphi 12 Athens
 
#1

Memory Leak bei rekursiven Aufruf...

  Alt 1. Nov 2007, 01: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz