Announcement

Collapse
No announcement yet.

Memory Leak bei rekursiven Aufruf...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Memory Leak bei rekursiven Aufruf...

    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?

    Code:
    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.
    Zuletzt editiert von Niels14; 09.11.2007, 01:18.

  • #2
    pos Befehl verursacht das Problem!!!!

    Hi, ich habe jetzt den Ausloeser fuer den riesen Speicherverbrauch gefunden!
    Die Zeile in der ich meine TStrings liste auf das Vorkommen eines andere Strings untersuche hat das Problem verursacht:
    Code:
    If pos(SireKey, AnimalList.GetText) > 0 then ...
    Ich habe nun einfach die Ueberpruefung ausgelassen und der Speicher ist immer sauber wieder freigegeben worden!
    Hat einer von euch eine Ahnung was der "pos" Befehl intern genau macht und wieso er soviel Speicher reserviert und nicht mehr hergibt!
    Hat mir jemand vielleicht einen workaround der nicht so viel Speicher frisst?
    Ist das ein bekanntes Problem? Hat jemand schon etwas aehnliches erlebt oder eine andere Moeglichkeit gefunden das zu umgehen?

    Comment


    • #3
      Autsch! Loesung gefunden!

      Es war
      Code:
      AnimalList.GetText
      . Es reserviert Speicher und man sollte ihn manuell freigeben! Ich habe es aus versehen statt die normale Text Eigenschaft genommen.
      Mein Fehler

      Comment

      Working...
      X