![]() |
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 |
Re: TStringList AddObjects
Achtung :warn: TList gibt die Objekte nicht frei. Due wurden höchstens durch Deine Anwendung automatisch freigegeben, aber nicht durch TList. Wenn man Objekte in einer Liste halten will, dann sollte man auf TObjectList (Unit Contnrs) zurückgreifen, die kann Objekte auch automatisch freigeben.
...:cat:... |
Re: TStringList AddObjects
Zitat:
Eigentlich ist das zu erwarten, da du ja nur einen Verweis und nicht das Objekt in die StringListe Kopierst. mit dem StringList1.Objects[i].Free zerstörst du das TLabel Objekt in deinem Fall. Damit zeigt der entsprechende Verweis von Stringlist2 natürlich auf ein nicht mehr existierendes Objekt. |
Re: TStringList AddObjects
Hallo GuenterS,
Zitat:
|
Re: TStringList AddObjects
@sakura, missverständnis :!:
im Onclose der Anwendung gebe ich die objecte frei, alle, erst dann lösche ich die instanz der Tlist. oder ist es für mich noch zu früh :shock: raik |
Re: TStringList AddObjects
Zitat:
...:cat:... |
Re: TStringList AddObjects
Hmm, mich würde das stören wenn bei Freigabe von TList auch die Objecte frei gegeben werden. Wenn ich beispielsweise in eine TList meine ganzen Buttons packe um diesen dann per schleife eigenschaften zu zuweisen, will ich doch nicht das nach freigeben von TList auch meine ganzen Buttons vom TForm verschwunden sind... Finds richtig das Tlist das nicht macht bzw Stringlist mit den Objects
|
Re: TStringList AddObjects
was will uns der künstler damit sagen :shock: :?:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:57 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