![]() |
TStringList AddObjects
Hallo DP Gemeinde,
ich habe gerade einmal einen Test gemacht und war über das Ergebnis überrascht, vielleicht deswegen, weil ich bisher etwas falsch verstanden habe? :stupid: Ich habe zwei StringListen erzeugt. Anschließend erzeuge ich 1000 Objekte (TLabel) und weise sie mit AddObjects sowohl der StringList1 als auch der StringList2 zu. Anschließend lösche ich alle Objekte der StringList1 in dem ich explizit StringList1.Objects[i].Free für alle i's aufrufe. Wenn ich jetzt auf das Object über Stringlist2 zugreife, funktioniert das ohne Fehler! Ich dachte, dass die Objekte nur als Verweise gespeichert werden. Stimmt das nicht? |
Re: TStringList AddObjects
Zitat:
Folgendes geht ohne AV
Delphi-Quellcode:
Dieses geht nur mit AV
procedure TForm1.Button1Click(Sender: TObject);
var L: TLabel; begin L := TLabel.Create(Self); L.Tag := 5; L.Free; L.Tag := 0; end;
Delphi-Quellcode:
...:cat:...
procedure TForm1.Button1Click(Sender: TObject);
var L: TLabel; begin L := TLabel.Create(Self); L.Caption := 'Hi Spockie'; L.Free; L.Caption := 'Bye Spockie'; end; |
Re: TStringList AddObjects
Hallo sakura,
das ist ja interessant. Ist es denn auch richtig, dass StringList.Clear NICHT die verknüpften Objekte löscht, sondern dass es Verantwortung desjenigen ist, der die Objekte erstellt hat, diese vor Aufruf von "Clear" manuell zu löschen? |
Re: TStringList AddObjects
hallo spocky,
das gleiche problem hatte ich auch, du bist selbst verantwortlich die erzeugten objekte zu zerstören raik |
Re: TStringList AddObjects
Zitat:
...:cat:... |
Re: TStringList AddObjects
Hallo raik,
OK, das ist das was ich vermutet hatte. Ich habe zur Überprüfung oben genanntes Programm geschrieben und war eben überrascht, dass ich die Objekte noch benutzen konnte, obwohl ich sie manuell gelöscht hatte. Aber sakura hat dazu ja die Begründung geliefert. Wie hast du denn geprüft, ob der Speicher wirklich freigegeben wurde? |
Re: TStringList AddObjects
Zitat:
...:cat:... |
Re: TStringList AddObjects
Hallo sakura,
das ist auch eine Möglichkeit :mrgreen: . Ich hatte damals (als ich noch jung war :stupid: ) unter Turbo Pascal eine Funktion benutzt, die mir den zurverfügungstehenden Speicherplatz zurückgemeldet hat. Ich glaube die hieß MemAvail. Damit habe ich während der Entwicklung des Programmes sichergestellt, dass ich keine Speicherleichen erzeuge. Gibt es eine solche Funktion noch? Bei der komplexen Speicherverwaltung, die in 32-bit BS üblich ist, vermute ich, dass die Antwort nein ist... Oder? :nerd: |
Re: TStringList AddObjects
Schau mal in die CodeLib (alte und neue Einträge) ich sah erst heute was dazu ;)
...:cat:... |
Re: TStringList AddObjects
hallo spocky,
bei mir war die sache nur ähnlich, es ging bei mir um ein stringgrid , dort wurden objecte erstellt, wo ich den zustand der einzelnen zellen einstellen, bzw auslesen konnte. gleichzeitig habe ich die objecte in eine Tlist geschrieben und dann im close bin ich alle objeckte durchgegangen und zum schluß die Tlist.free gemacht. memprof ssagte mir am ende das der speicher leer ist. ichhabe aber nicht probiert die Tlist zwischendurch zu löschen, sodas ich keine aussage treffen kann, ob die objecte trotz löschen noch im speicher waren raik |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz