![]() |
Speicherverwaltung bei Objektliste
Moin,
eine Frage zur Speicherverwaltung: ich erzeuge lokal eine TObjectlist, die für einen Vergleich mit einigen Objekten gefüllt wird. Danach ist die Liste über. Beim nächsten Durchgang muß ich sie wieder neu erzeugen und mit neuen Objekten füllen. Reicht es, wenn ich sie mit einem create neu erzeuge? Werden dann auch die Speicherzuweisungen zu den Objekten gekappt? Oder wird durch die lokale Definition der Speicherplatz beim Verlassen ohnehin freigegeben. Ich brauche das nicht so oft, daß es zu Speicherlecks kommen könnte, aber wissen würde ich es trotzdem gerne. Grüße, Messie |
DP-Maintenance
Dieses Thema wurde von "alcaeus" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Ist wohl mehr ein Object-Pascal-Thema als was allgemeines ;) |
Re: Speicherverwaltung bei Objektliste
wenn du die liste "häufiger" brauchst reichts ja wenn du sie außerhalb "createst" und dann zu anfang deiner füllroutine einfach "clearst" und in irgendeiner finalisierungsfunktion wieder "freest"
um 08:54: wenn du sie einfach nur jedesmal neuerstellst, bleiben die alten inhalte im speicher und kann so zu speicherlecks führen [edit=alcaeus]Doppelpost zusammengefuehrt. In Zukunft bitte die Edit-Funktion verwenden. Mfg, alcaeus[/edit] |
Re: Speicherverwaltung bei Objektliste
Du solltest also immer die Objekte und die TObjectList nachdem du sie benutzt hast wieder ordnungsgemäß freigeben.
|
Re: Speicherverwaltung bei Objektliste
Hallo messie,
das TObjectList-Objekt musst du auf jeden Fall wieder freigeben. Das hier:
Delphi-Quellcode:
erzeugt z.B. ein huebsches Speicherleck ;)
for i := 0 to 10 do
begin SomeObjList := TObjectList.Create(); for j := 0 to 5 do SomeObjList.Add(TForm1.Create()); DoSomething(); end; Du hast in diesem Fall mehrere Moeglichkeiten:
Falls du die Objekte wirklich nur brauchst, solange die ObjectList existiert, kannst du den aOwnsObjects-Parameter beim Constructor verwenden. Gibst du dort ein True mit, so gilt die ObjectList als Besitzer der hinzugefuegten Objekte, und gibt diese bei einem Clear() oder Free() wieder frei. So musst du dich nicht um eventuelle ungueltige Referenzen bzw. Objektleichen im Speicher kuemmern. Greetz alcaeus |
Re: Speicherverwaltung bei Objektliste
Das mit dem AOwnsObject hatte ich schon so gemacht. Die Liste am Ende der Routine mit free freizugeben fände ich auch gut, nur bleibt mir ein Problem (vielleicht ist dies mein Eigentliches): ich greife in einer anderen Routine ständig auf diese Liste zu. Bisher verwende ich eine if assigned-Anweisung, um zu Prüfen, ob es die Liste gibt. Nach einem free bleibt die Referenz in der Zuweisungsliste aber erhalten, also funzt if assigned hier nicht.
Grüße, Messie |
Re: Speicherverwaltung bei Objektliste
|
Re: Speicherverwaltung bei Objektliste
Zitat:
Grüße, Messie |
Re: Speicherverwaltung bei Objektliste
@alceus
Zitat:
|
Re: Speicherverwaltung bei Objektliste
@messie
mit FreeAndNil() meinte alceus das du anstelle von objList.Free lieber FreeAndNil(objList); verwenden sollst |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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 by Thomas Breitkreuz