erstmal ein Code-Schnipsel aus einem Programm, dass ich übernommen habe, und ich brauche ein bisschen Unterstützung für das Verständnis:
Code: Alles auswählen
var
begList : TList;
PString : PStr; // pointer auf String
begin
begList.Create;
begList.clear;
aString := '';
// aString zusammen bauen
For i:=0 to nCount-1 do
aString := aString+ '3' + #32;
// String in Liste
New(Pstring);
PString^ := aString;
begList.Add(PString);
// tue was neues mit dem String
aString := '';
aString := aString + 'ingendwas';
// Liste wieder freigeben
For i:=begList.Count-1 downto 0 do
begin
PString := begList.Items[i];
Dispose(PString);
begList.Delete(i);
begList.Free;
end;
end;
es wird eine TList, in die dann Strings eingehängt werden sollen (vielleicht sollte man hier besser ein TStringList nehmen), creatiert. Der anzuhängende String in der Routine erst zusammengebaut, was mittels aString geschieht. Um den an die Liste zu hängen, wird ein Pointer auf String-Speicherplatz mit New() besorgt, dem der zusammengebauten String zugewiesen wird. Dieser Pointer zeigt nun auf Speicher, der Inhalt von aString enthält; der Pointer wird an die TList gehängt, richtig?
Das erscheint mir schon eher kompliziert. Geht das einfacher? Muss ich tatsächlich den aString umspeichern, um zu vermeiden, dass anschließend der String in der TList geändert wird; der String aString wird schließlich im folgenden weiter verwendet, mit neuem Inhalt beschrieben, und wieder an die TList angehängt? Die bereits angehängte Information soll nicht verloren gehen.
Zum Schluss wird der Speicher wieder freigegeben, was auch eher kompliziert geschieht: erst werden alle Einträge einzeln gelöscht, entfernt und der entsprechende Speicher freigegeben. Zum Schluss wird die TList freigegeben. Reicht es nicht, nur TList.Free aufzurufen oder bleiben dann Speicherleichen zurück (Memory Leak würde ich natürlich vermeiden wollen - das ganze Konstrukt wird gute 20 mal angewendet )?
Wäre schön, wenn Ihr mich erleuchten könntet. Ich versuche, den Code zu entwirren und zu vereinfachen, wo es geht.
Danke,
Photor