Autor Beitrag
bigmasterdenis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 48



BeitragVerfasst: Mo 15.10.07 14:51 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Mo 15.10.07 14:55 
Zeig dochmal deinen Code.. vielleicht gibt es da einfach nur eine ungereimtheit..

Ich benutze die StringList meist so..:
ausblenden 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.

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
bigmasterdenis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 48



BeitragVerfasst: Mo 15.10.07 15:23 
Danke! Habs auch auf deine Weise probiert. Hat leider auch nicht geklappt. Meine Funktion sieht wie folgt aus:

ausblenden 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:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 15.10.07 15:27 
user profile iconbigmasterdenis hat folgendes geschrieben:
ausblenden 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:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Alpha_Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: 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 ;)

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.


Zuletzt bearbeitet von Alpha_Wolf am Mo 15.10.07 15:52, insgesamt 1-mal bearbeitet
bigmasterdenis Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 48



BeitragVerfasst: 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 :-) :-) :-)