![]() |
TList - Fragen zur Speicherverwaltung
Nach langer Suche hier im Forum und auch über Google sind bei mir noch ein paar Fragen zur Verwendung von TList offen.
Mir ist klar, dass TList nur Pointer speichert. Der Speicher, auf den die Pointer zeigen, muss manuell freigegeben werden bei Löschen eines Items. Ich habe nun eine TList, die während der Laufzeit einmal gefüllt wird und dann nicht mehr verändert wird. Es gibt also keine Funktion, die ein Item entfernt oder die ganze Liste leert. 1. Was passiert mit dem Speicher der referenzierenden Pointer, wenn das Programm komplett beendet wird? 2. Wenn der Speicher nicht freigegeben wird, an welcher Stelle im Programm sollte ich die TList "disposen"? Danke schonmal Leo :) |
Re: TList - Fragen zur Speicherverwaltung
Zitat:
Grüße Klaus |
Re: TList - Fragen zur Speicherverwaltung
Zitat:
Viele Grüße |
Re: TList - Fragen zur Speicherverwaltung
OK, also bei OnDestroy im Hauptformular.
Könnt ihr mir bitte noch kurz die Frage 1 beantworten? Wenn ich das Programm beende, wird dann der Speicher freigegeben oder bleiben die belegten Zellen auf immer und ewig (ok, bis zum nächsten Windowsstart ;)) belegt? |
Re: TList - Fragen zur Speicherverwaltung
Speicher manuell belegen und nicht wieder freigeben schafft wunderbare Memoryleaks.
Grüße Klaus |
Re: TList - Fragen zur Speicherverwaltung
Der Speicher wird frei gegeben sobald der Prozess welcher den Speicher angefordert hat beendet ist.
Trotzdem solltest du dir so etwas nie angewöhnen! |
Re: TList - Fragen zur Speicherverwaltung
das Betriebssystem reserviert für dein Programm Speicher (Heap,Stack,...), wird das Programm komplett beendet,
müsste das Betriebssystem den zugeteilten Speicher eigentlich automatisch wieder freigeben, also sind deine Objekte wieder freigeben. Am besten sorge selbst dafür, dass alles wieder richtig freigeben wird! |
Re: TList - Fragen zur Speicherverwaltung
Keine Sorge, ich möchte schon dafür sorgen, dass alles seine Ordnung hat, es war nur eine Verständnisfrage :) Danke für die Antworten.
|
Re: TList - Fragen zur Speicherverwaltung
Kann ich bestätigen. Der Speicher wird vom Betriebssystem automatisch beim verlassen des Programms freigegeben.
Nichsdestotrotz würde ich die Freigabe explizit in Destroy bzw. OnDestroy des Hauptformulars vornehmen. Da Du Delphi 2007 benutzt kannst Du auch mal folgendes tun: In den ProjektQuelltext (Project / View Source) folgendes direkt nach begin einfügen: ReportMemoryLeaksOnShutdown := True Du wirst nun beim Beenden des Programms auf alle Speicherlecks hingewiesen. Ziel sollte es sein das, egal wie viel man mit dem Programm arbeitet und egal wie lange es lief, am Ende keine Meldung über Speicherlecks kommen. Sobald Du den Stand hast das keine Speicherlecks mehr angezeigt werden kannst Du mögliche Speicherlecks bei neuem Code schnell entdecken da nach einer Änderung dann ja plötzlich wieder Lecks auftreten ;) |
Re: TList - Fragen zur Speicherverwaltung
1. Bevor das Betriebssystem eingreift, arbeitet erstmal noch der Speichermanager von Delphi und gibt alles frei.
2. Den Speicher gibst du einfach frei, wenn TList.Free (also in Destroy) aufgerufen wird. |
Re: TList - Fragen zur Speicherverwaltung
Was speicherst du in der TList?
Wenn es Objekte sind solltest du lieber TObjectList nehmen. Diese kann auch die Objekte wieder freigeben. s.H. Constructor -> owns muss auf true sein. |
Re: TList - Fragen zur Speicherverwaltung
Ich kann den Antwortern eigentlich nur bedingt zustimmen.
Das Freigeben der Objekte in der TList muss man abhängig von dem Objekt machen, an dem TList hängt. Ist TList in einer Klasse definiert, dann TList aufräumen, wenn diese Klasse sich gerade in Rauch auflöst, wäre wie hier schon richtig angegeben im OnDestroy des Forms. Ist TList aber als Variable in der Unit definiert, dann sollte die Freigabe im Abschnitt finalization erfolgen. Objekte in einer (wie hier verwendeten) TList müssen beim Beenden nicht zwangsläufig manuell aus dem Speicher entfernt werden. Bei einigen Klassen kann ich ja beim Erzeugen auch einen Owner mitgeben TIdFTP.Create( AOwner : TComponent ). Habe ich dieses gemacht, so wird dieses erzeugte Objekt beim Entfernen von Owner auch automatisch aus dem Speicher geschmissen. Zitat:
cu Oliver |
Re: TList - Fragen zur Speicherverwaltung
Zitat:
|
Re: TList - Fragen zur Speicherverwaltung
Zitat:
Das Freigeben von angehängten Objekte kann nur TObjectList. |
Re: TList - Fragen zur Speicherverwaltung
Ich sehe, wir meinen das gleiche.
Deswegen muss man es (alles angehängte) ja in Destroy freigeben. |
Re: TList - Fragen zur Speicherverwaltung
Ich glaube, Sir Rufo hat den Satz
Zitat:
|
Re: TList - Fragen zur Speicherverwaltung
Zitat:
Ich hab überlegt, Objekte zu nehmen, habe aber keine Lust auf Typecastings. |
Re: TList - Fragen zur Speicherverwaltung
Bei records musst du doch auch von einem Pointer auf ein PRecord casten :gruebel:
Ich würde lieber gleich Klassen nehmen. Erstens hast du dann den Vorteil von TObjectlist. Zweitens kannst du dann jederzeit noch Methoden ergänzen, oder gar eine Ableitung deiner ersten Klasse speichern. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 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