Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TStringList AddObjects (https://www.delphipraxis.net/22158-tstringlist-addobjects.html)

MrSpock 13. Mai 2004 10:55


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?

sakura 13. Mai 2004 11:01

Re: TStringList AddObjects
 
Zitat:

Zitat von MrSpock
Ich dachte, dass die Objekte nur als Verweise gespeichert werden. Stimmt das nicht?

Doch, das ist korrekt, aber wenn der Speicher noch nicht andersweitig genutzt wurde, dann gibt es oft keinen Fehler :shock: Es passiert aber auch nichts Gutes. Es kommt auch auf die genutzte Property an.

Folgendes geht ohne AV
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  L: TLabel;
begin
  L := TLabel.Create(Self);
  L.Tag := 5;
  L.Free;
  L.Tag := 0;
end;
Dieses geht nur mit AV
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  L: TLabel;
begin
  L := TLabel.Create(Self);
  L.Caption := 'Hi Spockie';
  L.Free;
  L.Caption := 'Bye Spockie';
end;
...:cat:...

MrSpock 13. Mai 2004 11:21

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?

kiar 13. Mai 2004 11:26

Re: TStringList AddObjects
 
hallo spocky,

das gleiche problem hatte ich auch, du bist selbst verantwortlich die erzeugten objekte zu zerstören

raik

sakura 13. Mai 2004 11:36

Re: TStringList AddObjects
 
Zitat:

Zitat von MrSpock
sondern dass es Verantwortung desjenigen ist, der die Objekte erstellt hat, diese vor Aufruf von "Clear" manuell zu löschen?

Vor oder nach, das ist egal. Solange Du noch drauf zugreifen kannst :mrgreen: Clear zumindest löscht die Objekte nicht und wenn Du es auch nicht tust, dann gibt es Speicherleichen :)

...:cat:...

MrSpock 13. Mai 2004 11:38

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?

sakura 13. Mai 2004 11:39

Re: TStringList AddObjects
 
Zitat:

Zitat von MrSpock
Wie hast du denn geprüft, ob der Speicher wirklich freigegeben wurde?

Wozu prüfen, schau Dir mal den Source-Code zu TStringList.Clear an. Da wird lediglich der durch die Liste reservierte Speicher freigegeben - mehr nicht ;)

...:cat:...

MrSpock 13. Mai 2004 11:43

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:

sakura 13. Mai 2004 11:44

Re: TStringList AddObjects
 
Schau mal in die CodeLib (alte und neue Einträge) ich sah erst heute was dazu ;)

...:cat:...

kiar 13. Mai 2004 12:27

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

sakura 13. Mai 2004 12:50

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:...

GuenterS 13. Mai 2004 13:09

Re: TStringList AddObjects
 
Zitat:

Zitat von MrSpock
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?



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.

MrSpock 13. Mai 2004 13:31

Re: TStringList AddObjects
 
Hallo GuenterS,

Zitat:

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.
Genau das war ja, was mich verwundert hat. Ich konnte eben trotzdem auf das eigentlich nicht mehr existierende Object über einen Verweis aus StringList2 zugreifen. Und genau das habe ich nicht erwartet!

kiar 13. Mai 2004 13:44

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

sakura 13. Mai 2004 13:48

Re: TStringList AddObjects
 
Zitat:

Zitat von kiar
@sakura, missverständnis

missverständnis, yepp. Ich hatte nicht rausgelesen, daß Du die Objekte expliziet frei gibst. Aber ansonsten schaue Dir (schaut Euch) mal TObjectList an, die nimmt Euch da eine Menge Arbeit ab ;)

...:cat:...

SirThornberry 13. Mai 2004 13:53

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

kiar 13. Mai 2004 14:32

Re: TStringList AddObjects
 
was will uns der künstler damit sagen :shock: :?:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz