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
   // Tue irgendwas...
  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:
//returns string list with content of a folder
function TForm1.getContent(folder: String): TStringList;
var
    i,from: Integer;
    stringList: TStringList;
begin
    stringList := TStringList.Create;

    Kazip1.Active := true;
    Kazip1.FileName := Label3.Caption;

    //find all files in the zip archive beginning with 'folder'
    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 user profile iconChristian S.: Code- durch Delphi-Tags ersetzt


Christian S. - Mo 15.10.07 15:27

user profile iconbigmasterdenis 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 :-) :-) :-)