![]() |
Zugriffsverletzung bei TObjectlist.delete
Hallo Leute,
ich habe irgendwie ein kleines Problem beim Löschen aus meiner TOjectlist. Rufe ich im Destructor das Delete auf, bekomme ich eine Zugriffsverletzung. Ersezte ich delete durch free (ohne Schleife) bekomme ich den gleichen Fehler. Ich blicks irgendwie nicht. :gruebel: Dankbar für jeden Tip.
Delphi-Quellcode:
type TStreamlist= class (TObjectlist)
private FStreamObjectList:TObjectlist; ..... constructor TStreamlist.create; begin; inherited create; FStreamObjectList:=TObjectList.Create(true); end; destructor TStreamlist.destroy; begin; while FStreamObjectList.Count>0 do begin FStreamObjectList.delete(0); {Zugriffsverletzung} end; inherited Destroy; end; |
Re: Zugriffsverletzung bei TObjectlist.delete
1. Du machst es dir zu Kompliziert, wenn QwnObjects der TObjectList noch auf True ist (Standard) dann recht ein Clear aus, bzw. ein zerstören der Liste selber, diese gibt dann alle Objecte frei...
2. Wäre eine rückwärts laufende For-Sschleife bei weitem schneller... 3. Die Exception kommt aus dem Destructor des Objetes welches du da versuchst freizugeben... (denk ich, also durchlauf ihn mal mit dem Debugger...) Bye Christian :zwinker: Edit: Wie ich sehe, erstellst du die Liste sogar explezit nochmal mit OwnsObjects := True;, vondaher kannst du dir deinen ganzen Code da im destructor sparen, wenn du dir mal die Vorfahren deiner Liste anschaust, wirst du sehen, dass diese alle Objecte freigibt... Ansatzpunkt wie gehabt Punkt 3. :wink: |
Re: Zugriffsverletzung bei TObjectlist.delete
Zitat:
|
Re: Zugriffsverletzung bei TObjectlist.delete
Ok so genau weiß ich das nicht, hab auch gerade keine Lust zu schaun, was Delphi daraus macht... ;)
Aber rein ausm Gedächniss sollte die schon schneller sein und nicht den selben Code ausspucken.. =p Bye Christian |
Re: Zugriffsverletzung bei TObjectlist.delete
Warum leitest Du von TObjectList ab und erstellst dann in der Klasse noch eine TOBjectList (FStreamObjectList) :gruebel:
|
Re: Zugriffsverletzung bei TObjectlist.delete
Hallo zusammen,
Vielen Dank für die Tips. ich habe noch etwas ausprobiert und dabei festgestellt, das mein FStreamObjectList.Count sinnvolle Werte enthält, aber ich immer noch eine Zugriffsverletzung bekomme,wenn ich FREE oder Delete oder Clear verwende.Ich dachte, ich gebe das Object an einer anderen Stelle schon frei. Finden konnte ich es bisher noch nicht. Kann es noch etwas anderes sein? @Kedariodakon, Danke dür die Erklärung. Ich habe es mal mit Clear, Free probiert. Der Fehler ist jedoch noch der gleiche. siehe oben! @Jelly Du hast natürich Recht. Kleiner Schnitzer. |
Re: Zugriffsverletzung bei TObjectlist.delete
probiers mal damit (duerfte unabh. von der OwnObjects-Eigenschaft fkt.) :
destructor TStreamlist.destroy; begin; for i = 1 to FStreamObjectList.Count do begin FStreamObjectList.Items[i-1].free // jedes einzelne Objekt expl. freigeben end; FStreamObjectList.Clear(); // jetzt duerften nur noch nils da sein inherited Destroy; // und zum Schluss noch das Basisdestroy end; |
Re: Zugriffsverletzung bei TObjectlist.delete
Zitat:
In jedem Falle sollte dein TStreamlist-Destruktor die Liste FStreamObjectList selbst überhaupt auch mal freigeben. Diese Anforderung, gemeinsam mit der Tatsache, dass OwnsObjects TRUE ist, sollte folgendes ausreichen lassen:
Delphi-Quellcode:
Ob dabei jettz noch der Fehler auftaucht, musst du mal gucken. Vielleicht ist die Auto-Freigabe der Liste auch so schlau und ignoriert irgendwie tote Referenzen (z.B. durch Abfangen der Execption). Das weiß ich jetzt nicht.
destructor TStreamlist.destroy;
begin FStreamObjectList.Free; inherited Destroy; end; Zitat:
Aber wenn das jetzt geändert wurde, sieht die Geschichte ja völlig anders aus. @ozz Du solltest nochmal den jetzt aktuellen Code einstellen. |
Re: Zugriffsverletzung bei TObjectlist.delete
Hallo,
Zitat:
Gruß Hawkeye |
Re: Zugriffsverletzung bei TObjectlist.delete
Welchen Destructor versucht er dann da aufzurufen? (Meine Glass versteckt sich schon seit gestern Abend...)
Was speicherst du in die Liste? Bye Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 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