Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:21 Uhr.
Seite 1 von 2  1 2      

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