AGB  ·  Datenschutz  ·  Impressum  







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

Clear von TList überschreiben mit Objekten

Ein Thema von Luckie · begonnen am 3. Jul 2007 · letzter Beitrag vom 4. Jul 2007
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#21

Re: Clear von TList überschreiben mit Objekten

  Alt 3. Jul 2007, 13:08
Auch wenn ich Nach TImageEnVect catse kommt es zur AV. Wo er genau in der Assign-Methode aussteigt versuche ich gerade zu ermitteln.

aber es ist doch richtig, dass es zu einem Speicherleck an dieser Stelle kommt, wenn ich in der Methode Clear die Objekte in der Liste nicht freigebe oder?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#22

Re: Clear von TList überschreiben mit Objekten

  Alt 3. Jul 2007, 13:14
Ja,

ist richtig.
Ich habe den Tag rot angestrichen, als ich von memcheck gehört habe
Naja, die folgenden Tage war ich mit Leck abdichten beschäftigt


Heiko
Heiko
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#23

Re: Clear von TList überschreiben mit Objekten

  Alt 3. Jul 2007, 13:23
Zitat von Luckie:
aber es ist doch richtig, dass es zu einem Speicherleck an dieser Stelle kommt, wenn ich in der Methode Clear die Objekte in der Liste nicht freigebe oder?
Speicherlecks dürfte es eigentlich nicht geben, da ja beim TList.destroy auch die clear methode immer aufgerufen wird.

Ich empfehle aber trotzdem FInnerList.Clear in deiner TPageCollection.clear methode aufzurufen.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#24

Re: Clear von TList überschreiben mit Objekten

  Alt 3. Jul 2007, 13:24
Eine TList macht glaube ich nur ein Dispose beim Clear. Das heißt, hat man Objekte drin, dann gibts n Speicherleck, wenn man die nicht zuvor freigibt.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#25

Re: Clear von TList überschreiben mit Objekten

  Alt 3. Jul 2007, 13:26
Ich habe mal nachgeguckt. Clear von TList setzt nur die Länge und Kapazität auf null. Da wird also nichts freigegeben.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#26

Re: Clear von TList überschreiben mit Objekten

  Alt 3. Jul 2007, 13:27
Zitat von DGL-luke:
Eine TList macht glaube ich nur ein Dispose beim Clear. Das heißt, hat man Objekte drin, dann gibts n Speicherleck, wenn man die nicht zuvor freigibt.
Ja, aber Luckie gibt ja die Objekte direkt frei, von daher gibt es keine speicherlecks:
Delphi-Quellcode:
procedure TPageCollection.Clear;
var
  i: Integer;
begin
  for i := FInnerList.Count - 1 downto 0 do
  begin
    TObject(FInnerList.Items[i]).Free;
  end;
  FInnerList.Clear;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#27

Re: Clear von TList überschreiben mit Objekten

  Alt 3. Jul 2007, 13:31
Nur leider führt dieser Code zu einer AV, wenn ich danach Assign aufrufe.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#28

Re: Clear von TList überschreiben mit Objekten

  Alt 3. Jul 2007, 13:34
Hallo Michael,

ein Leck könnte hier entstehen:

Delphi-Quellcode:
procedure TPageCollection.SetItem(Index: Integer; Item: TImageEnVect);
begin
  FInnerList.Items[Index] := Item;
end;
TList schickt zwar beim Entfernen des alten Elements eine Notification, aber erst in TObjectList wird diese Nachricht abgehört. Du solltest also vor der Zuweisung das alte Element selbst freigeben.

Was die AV angeht: wurden die TImageEnVect-Controls eventuell schon von ihrem Parent zerstört, wenn du versuchst, sie zu freizugeben? klick

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#29

Re: Clear von TList überschreiben mit Objekten

  Alt 3. Jul 2007, 14:02
Ich sehe gerade im Debugger:
Zitat:
Debug Output: FastMM has detected an attempt to call a virtual method on a freed object. An access violation will now be raised in order to abort the current operation.

Freed object class: TImageEnVect

Virtual method: Destroy

Virtual method address: 5BC0D0

Process DWFotoBook.exe (3288)
Heißt dass, dass da schon was freigegeben wurde? Ich wüsste aber nicht wo das im Quelltext passiert sein sollte.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#30

Re: Clear von TList überschreiben mit Objekten

  Alt 3. Jul 2007, 14:27
Ich denke mal du gibts irgendwo vorher schon ein TImageEnVect-objekt mit FInnerlist.Items[i].free, aber vergisst diesen itemeintrag auch aus der TList zu löschen mit FInnerlist.delete(i).

bsp:

du hast 4 objekte in der TList:

Finnerlist.Items[0]
Finnerlist.Items[1]
Finnerlist.Items[2]
Finnerlist.Items[3]

und du gibst jetzt das 3te Item frei mit FInnerlist.Items[2].free (ohne anschließenden aufruf finnerlist.delete(2)), dann sieht es so aus;

Finnerlist.Items[0]
Finnerlist.Items[1]
Finnerlist.Items[2] (item immernoch verhanden, aber objekt bereits freigegeben
Finnerlist.Items[3]

In deiner Assign methode werden dann alle objekte durchgegangen und auf FInnerlist.Items[2] zugegriffen, obwohl das objekt bereits freigegeben wurde.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 18:36 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