Entwickler-Ecke
Dateizugriff - StringList gibt Speicher nicht frei
bigmasterdenis - Mo 15.10.07 14:51
Titel: StringList gibt Speicher nicht frei
Hallo Leute!
Ich benutze eine StringList um Dateinamen zu speichern, welche dann in eine Textdatei gespeichert werden. Nachdem ich die Dateinamen in die txt gepeichert habe, möchte ich den Speicher freigeben. Ich habs mit
MyStringList.Clear;
MywStringList.Free;
versucht. Ohne großen Erfolg. Ich bekomme vielleicht ein MB frei. Wenn ich dieselbe Procedur nochmal ausführe, dann wird nochmal zusätzlich soviel Platz belegt (bei vielen Dateien ist das extrem viel).
Wie kann man die Daten aus dem Speicher schmeißen?
thanx 4 help
Alpha_Wolf - Mo 15.10.07 14:55
Zeig dochmal deinen Code.. vielleicht gibt es da einfach nur eine ungereimtheit..
Ich benutze die StringList meist so..:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| try lStringList.Create := TStringList.Create(); if assigned(lStringList) then begin end; finally if assigned(lStringList) then FreeAndNil(lStringList); end; |
Durch den try..finally Block kann ich mir fast 100%ig sicher sein, dass die allokierte StringList wieder freigegeben wird.
bigmasterdenis - Mo 15.10.07 15:23
Danke! Habs auch auf deine Weise probiert. Hat leider auch nicht geklappt. Meine Funktion sieht wie folgt aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| function TForm1.getContent(folder: String): TStringList; var i,from: Integer; stringList: TStringList; begin stringList := TStringList.Create;
Kazip1.Active := true; Kazip1.FileName := Label3.Caption;
for i := 0 to Kazip1.Entries.Count-1 do if ( (Copy(KAZip1.Entries.Items[i].FileName,0,length(folder)) = folder)) and not KAZip1.Entries.Items[i].IsFolder then begin from := pos('/', copy(KAZip1.Entries.Items[i].FileName, 0, length(KAZip1.Entries.Items[i].FileName))); stringList.Add(copy(KAZip1.Entries.Items[i].FileName, from+1, length(KAZip1.Entries.Items[i].FileName))); end; result := stringList; end; |
Die Funktion wird von einer anderen Procedur in Schleife aufgerufen. Etwa so:
Delphi-Quelltext
1: 2:
| for k := 0 to getContent('A_Folder').Count-1 do newStringList.add(getContent('A_Folder')[k]); |
Vielleicht liegt hier das Problem?
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt
Christian S. - Mo 15.10.07 15:27
bigmasterdenis hat folgendes geschrieben: |
Delphi-Quelltext 1: 2:
| for k := 0 to getContent('A_Folder').Count-1 do newStringList.add(getContent('A_Folder')[k]); | |
Wo wird denn die von mir im Quellcode markierte Stringliste wieder freigegeben?
//edit: Autsch! Du erzeugst ja auch noch in jedem Schleifendurchlauf die Stringliste neu :shock:
Alpha_Wolf - Mo 15.10.07 15:30
Danke Christian, hatte grad das gleiche geschrieben... aber du warst schneller ;)
Ich würde mir den zwischenschritt mit der extra Stringlist sparen und die Liste die du außerhalb deklarierst einfach mit dem Var Parameter der Funktion getContent übergeben.. Somit benötigst du nur eine Liste.. die du außerhalb der Schleife deklarierst.
EDIT: Und diese eine natürlich wieder freigibst ;)
bigmasterdenis - Mo 15.10.07 15:50
Danke für eure schnelle Antworten! Das mit der überflüssigen StringList scheint tatsächlich das Problem zu sein :-) :-) :-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!