AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherverwaltung bei Objektliste

Ein Thema von messie · begonnen am 27. Jul 2005 · letzter Beitrag vom 27. Jul 2005
Antwort Antwort
Seite 1 von 2  1 2      
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#1

Speicherverwaltung bei Objektliste

  Alt 27. Jul 2005, 07:48
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
  Mit Zitat antworten Zitat
27. Jul 2005, 07:50
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
(Gast)

n/a Beiträge
 
#3

Re: Speicherverwaltung bei Objektliste

  Alt 27. Jul 2005, 07:53
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]
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Speicherverwaltung bei Objektliste

  Alt 27. Jul 2005, 07:54
Du solltest also immer die Objekte und die TObjectList nachdem du sie benutzt hast wieder ordnungsgemäß freigeben.
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#5

Re: Speicherverwaltung bei Objektliste

  Alt 27. Jul 2005, 07:56
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Speicherverwaltung bei Objektliste

  Alt 27. Jul 2005, 08:03
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
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#7

Re: Speicherverwaltung bei Objektliste

  Alt 27. Jul 2005, 08:04
Hallo messie,

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

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Speicherverwaltung bei Objektliste

  Alt 27. Jul 2005, 08:11
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
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#9

Re: Speicherverwaltung bei Objektliste

  Alt 27. Jul 2005, 08:33
@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...
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#10

Re: Speicherverwaltung bei Objektliste

  Alt 27. Jul 2005, 08:33
@messie

mit FreeAndNil() meinte alceus


das du anstelle von objList.Free lieber FreeAndNil(objList); verwenden sollst
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:12 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