AGB  ·  Datenschutz  ·  Impressum  







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

Speicherverwaltung und .Free

Ein Thema von skyphab · begonnen am 16. Jun 2004 · letzter Beitrag vom 20. Jul 2004
Antwort Antwort
Seite 1 von 2  1 2      
skyphab

Registriert seit: 16. Apr 2004
17 Beiträge
 
Delphi 7 Enterprise
 
#1

Speicherverwaltung und .Free

  Alt 16. Jun 2004, 11:38
Hallo zusammen,

da ich zur Zeit mit Objekten und Objektlisten hantiere für ein Programm, dass 24h am Tag 7 Tage die Woche laufen muss (quasi immer ), ist es natürlich wichtig, dass der Speicher nicht irgendwann volläuft, weil ich instanzierte Objekte nicht richtig freigebe.

Daher meine Frage was ich beachten muss.
In einem Fall habe ich vier Klassen, die jeweils eine ObjectList haben und in dieser ObjectList 1..n instanzierte Objekte 'ablegen' (Abgelegt werden nur Zeiger auf die Objekte, oder wie ist das?).

Im Verlauf des Programms gibt es ein wildes Erstellen, Löschen, Hinzufügen, Neuerstellen von diesen Objekten und deren Listen, also muss das sauber laufen.
Die ObjectList erstelle ich mit dem Parameter true (OwnsObjects). Wie ist jetzt der saubere Weg, das Objekt und alle zugehörenden Objekte freizugeben?
Wenn ein Objekt der obersten Klasse gelöscht wird und ich es im destructor über Self.Free freigebe, sollte die Objektliste im gleichen Zuge freigesetzt werden, oder bedarf es dazu erst einem Objektliste.Free?
Die ganze Freisetzung muss sich dann durch alle Objekte ziehen, klappt das so oder muss ich noch etwas beachten?

Woran erkenne ich, ob das funktioniert?
Danke schonmal
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Speicherverwaltung und .Free

  Alt 16. Jun 2004, 11:42
Moin!

1. Im Destructor ein Self.Free?? Sehr interessant und sollte nicht funktionieren.
2. Wenn eine TObjectList OwnsObject auf True hat, dann wird beim entfernen eines Objektes diesea auch automatisch freigegeben.
3. Bsp: Wenn du bei der ObjectList ein Clear aufrufst, dann werden alle enthaltenen Objekte freigegeben und aus der Liste entfernt

MfG
Muetze1
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: Speicherverwaltung und .Free

  Alt 16. Jun 2004, 12:14
Zitat von Muetze1:
1. Im Destructor ein Self.Free?? Sehr interessant und sollte nicht funktionieren.
Funktionieren tut das schon. Man schafft nur eine Endlosrekursion.

Zitat:
2. Wenn eine TObjectList OwnsObject auf True hat, dann wird beim entfernen eines Objektes diesea auch automatisch freigegeben.
OwnsObjects ist per Standardeinstellung auf True gesetzt. Wenn man ein Objekte aus der ObjectList entfernen will, ohne das es freigegeben wird, muss man die Extract Methode von TObjectList nutzen.
  Mit Zitat antworten Zitat
nieurig

Registriert seit: 26. Apr 2004
113 Beiträge
 
Delphi 6 Professional
 
#4

Re: Speicherverwaltung und .Free

  Alt 16. Jun 2004, 13:41
Zitat:
Woran erkenne ich, ob das funktioniert?
Ich habe mal bei einem ähnlichen Problem die Funktion getHeapStatus() mit TotalAllocated eingesetzt. Problem dabei war, dass auch der genutzte Speicher durch die Oberfläche angezeigt wird und dieser in Abhängigkeit von den User-Aktivitäten stark schwankt. Trotzdem konnte man recht gut verfolgen, ob "Speicher verbraucht" wird.

Niels
Erspare Dir die Gedanken über ungelegte Eier !!!
  Mit Zitat antworten Zitat
skyphab

Registriert seit: 16. Apr 2004
17 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Speicherverwaltung und .Free

  Alt 17. Jun 2004, 09:47
Das mit dem GetHeapStatus ist super, danke!

Damit habe ich jetzt herausgefunden, dass das Freigeben der obersten Objektliste funktioniert.
Wenn in der Objektliste aber ein Objekt angelegt wird, dass wiederum eine Objektliste erzeugt, wird beim clear der 'obersten' Objektliste aber der Speicher der untersten Objektliste nicht freigegeben.

Zur Verdeutlichung (Ich habe den unwichtigen Teil des Codes rausgeschnippelt):

Klasse TAuftraege
Code:
procedure TAuftraege.Auftrag_Hinzufuegen(I_Auftrag: RAuftrag);
begin
  Objektliste.Add(TAuftrag.Create(I_Auftrag));
end;
Klasse TAuftrag
Code:
constructor TAuftrag.Create(I_Auftrag: RAuftrag);
begin
  Auftrag := I_Auftrag;
end;
Bei (In TAuftraege):

Code:
Objektliste.Clear;
und anschließendem neu Anlegen der Objekte, ändert sich der laut GetHeapStatus der zugewiesene Speicher nicht.

Allerdings so (Änderung bei TAuftrag.Create):

Klasse TAuftraege
Code:
procedure TAuftraege.Auftrag_Hinzufuegen(I_Auftrag: RAuftrag);
begin
  Objektliste.Add(TAuftrag.Create(I_Auftrag));
end;
Klasse TAuftrag
Code:
constructor TAuftrag.Create(I_Auftrag: RAuftrag);
begin
  RollenListe := TObjectList.Create(true);
  Auftrag := I_Auftrag;
end;
wird beim Objektliste.Clear und anschließendem Neuanlegen immer mehr Speicher belegt (~100Byte). Also wird wohl die Objektliste 'Rollenliste' nicht korrekt freigegeben. Ich muss nicht mal ein Objekt in diese Liste stellen.

Muss ich in diesem Fall Rollenliste irgendwo freisetzen? Ich habe in destructor TAuftrag.free Rollenliste.Free reingemacht, aber gebracht hat es nichts?
  Mit Zitat antworten Zitat
skyphab

Registriert seit: 16. Apr 2004
17 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Speicherverwaltung und .Free

  Alt 17. Jun 2004, 17:35
Hab's gefunden

Code:
destructor TAuftrag.Destroy;
begin
  RollenListe.Free;
  inherited Destroy;
end;


Aber der Tipp mit dem GetHeapStatus war wirklich Gold wert! Dickes Danke!
  Mit Zitat antworten Zitat
skyphab

Registriert seit: 16. Apr 2004
17 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Speicherverwaltung und .Free

  Alt 20. Jul 2004, 13:43
Hallo!

Ich krame den Thread nochmal aus, vielleicht kann mir jemand einen Tipp geben:

Ich bin gerade schier am verzweifeln. Ich lese Dateien momentan alle 1500ms mit einem Timer ein. Dabei werden die Inhalte dieser Dateien als Create-Parameter für erzeugende Objekte benutzt, die in einer ObjectList stehen.
Jedesmal bevor ich neue Objekte in diese Objectlist stelle, mache ich Objectlist.clear.

Es funkioniert alles, nur ich habe das Gefühl, dass ich Speicherleaks habe. Mit GetHeapStatus.TotalAllocated schwankt der zugewiesene Speicher die ganze Zeit. 224888 für mehrere Sekunden, dann 224600, später wieder 224910. Woher kommen diese Schwankungen? So wie es aussieht geht der Speicherverbrauch zurück, um dann später wieder mehr zu werden. Dann geht's wieder zurück und später noch mehr, so als würde sich das Ganze aufschaukeln.

Wenn ich mit Objektliste und Objekten arbeite, was muss ich denn noch zuästzlich beachten?!

Objektliste.add(Create(Objekt));
und später
Objektliste.clear;

Mit dem Clear werden doch alle Instanzen, die in dieser Objektliste waren, freigesetzt und der Speicher freigegeben? Oder nicht? Es ist zum heulen
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#8

Re: Speicherverwaltung und .Free

  Alt 20. Jul 2004, 14:22
Zitat von skyphab:
Hallo!
...
Objektliste.add({ Was hat das zu bedeuten? ->}Create(Objekt));
und später
Objektliste.clear;

..
? Welches create wird denn da aufgerufen und warum ohne klasse ?
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#9

Re: Speicherverwaltung und .Free

  Alt 20. Jul 2004, 15:16
Zitat von skyphab:
Mit dem Clear werden doch alle Instanzen, die in dieser Objektliste waren, freigesetzt und der Speicher freigegeben? Oder nicht? Es ist zum heulen
Ja, wenn OwnsObject der ObjectList auf True steht, was standardmäßig der Fall ist, und das jeweilige Objekt sich selber sauber freigeben kann, also der Destruktor ordentlich programmiert ist.

Übrigens ist MemProof ein gutes Tool, um seine Programme auf Speicherlecks zu prüfen.

Gruß, teebee
  Mit Zitat antworten Zitat
skyphab

Registriert seit: 16. Apr 2004
17 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Speicherverwaltung und .Free

  Alt 20. Jul 2004, 16:09
Zitat von teebee:
Zitat von skyphab:
Mit dem Clear werden doch alle Instanzen, die in dieser Objektliste waren, freigesetzt und der Speicher freigegeben? Oder nicht? Es ist zum heulen
Ja, wenn OwnsObject der ObjectList auf True steht, was standardmäßig der Fall ist, und das jeweilige Objekt sich selber sauber freigeben kann, also der Destruktor ordentlich programmiert ist.

Übrigens ist MemProof ein gutes Tool, um seine Programme auf Speicherlecks zu prüfen.

Gruß, teebee
MemProof werde ich mal testen, danke!

Das mit den Destruktoren ist mir noch ein kleines Rätsel. Was muss ich denn behandeln, im Destructor? Muss ich irgendwelche Variablen zurücksetzen, etc.? Oder nur mit diesem Objekt erzeugte Objekte freigeben?

Edit: Also wenn ich das Ganze mit MemProof laufen lasse, erhöht sich die Anzahl der Pointer und die Größe, um dann kurz danach, nach Freigeben der Objekte wieder auf den Urpsrungswert zurückzufallen (Wenn die eingelesenen Dateien sich nicht ändern)

Wenn ich im Programm in einem Destructor eine Objektliste nicht freigebe, erhöht sich die Anzahl der Pointer immer mehr.

Also habe ich keine Speicherleaks? Würde mich freuen, weil das Verwenden von Sharemem scheint mir nicht 100% treffend genug zu sein (die besagten Schwankungen). Vielen Dank für den Link zum Programm!

Edit: Ich habe einen Haufen Meldungen bei 'Resurces Details':
"GetMem allocates memory from the RTL memory manager and returns a pointer. The returned pointer must be freed with FreeMem"

Ich arbeite unter anderem mit einem dynamischen Array. Hat das was damit zu tun?
  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 10:18 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