Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Speicherverwaltung bei Objektliste (https://www.delphipraxis.net/50523-speicherverwaltung-bei-objektliste.html)

messie 27. Jul 2005 07:48


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 27. Jul 2005 07:50

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 ;)

barf00s 27. Jul 2005 07:53

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]

Mystic 27. Jul 2005 07:54

Re: Speicherverwaltung bei Objektliste
 
Du solltest also immer die Objekte und die TObjectList nachdem du sie benutzt hast wieder ordnungsgemäß freigeben.

alcaeus 27. Jul 2005 07:56

Re: Speicherverwaltung bei Objektliste
 
Hallo messie,

das TObjectList-Objekt musst du auf jeden Fall wieder freigeben. Das hier:
Delphi-Quellcode:
for i := 0 to 10 do
begin
  SomeObjList := TObjectList.Create();
  for j := 0 to 5 do
    SomeObjList.Add(TForm1.Create());
  DoSomething();
end;
erzeugt z.B. ein huebsches Speicherleck ;)

Du hast in diesem Fall mehrere Moeglichkeiten:
  1. Du erzeugst die ObjectList in jedem Schleifendurchgang, und gibst sie dort auch wieder frei:
    Delphi-Quellcode:
    for i := 0 to 10 do
    begin
      SomeObjList := TObjectList.Create();
      for j := 0 to 5 do
        SomeObjList.Add(TForm1.Create());
      DoSomething();
      SomeObjList.Free();
    end;
  2. Du erzeugst die ObjectList einmal, gibst sie erst nach der Schleife wieder frei, und loeschst sie am Schleifenbeginn:
    Delphi-Quellcode:
    for i := 0 to 10 do
     SomeObjList := TObjectList.Create();
    begin
      SomeObjList.Clear();
      for j := 0 to 5 do
        SomeObjList.Add(TForm1.Create());
      DoSomething();
    end;
    SomeObjList.Free();
    Diese Variante ist definitiv performanter, da du die Liste nicht jedesmal rauswirfst und neu erstellst.

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

messie 27. Jul 2005 08:03

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

alcaeus 27. Jul 2005 08:04

Re: Speicherverwaltung bei Objektliste
 
Hallo messie,

du musst in dem Fall einfach Delphi-Referenz durchsuchenFreeAndNil() anstatt Free() verwenden ;)

Greetz
alcaeus

messie 27. Jul 2005 08:11

Re: Speicherverwaltung bei Objektliste
 
Zitat:

Zitat von alcaeus
Hallo messie,

du musst in dem Fall einfach Delphi-Referenz durchsuchenFreeAndNil() anstatt Free() verwenden ;)

Greetz
alcaeus

Das gibt's bei einer TObjectlist nicht, jedenfalls nicht bei mir... Gibt es eine ALternative zur der PRüfung mit assign?

Grüße, Messie

barf00s 27. Jul 2005 08:33

Re: Speicherverwaltung bei Objektliste
 
@alceus

Zitat:

# Du erzeugst die ObjectList einmal, gibst sie erst nach der Schleife wieder frei, und loeschst sie am Schleifenbeginn:

Delphi-Quellcode:
for i := 0 to 10 do
SomeObjList := TObjectList.Create();
begin
  SomeObjList.Clear();
  for j := 0 to 5 do
    SomeObjList.Add(TForm1.Create());
  DoSomething();
end;
SomeObjList.Free();
Diese Variante ist definitiv performanter, da du die Liste nicht jedesmal rauswirfst und neu erstellst.
innerhalb der schleife erzeugst du jedesmal eine neue objectlist...

barf00s 27. Jul 2005 08:33

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 14:13 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