![]() |
ObjectList in Komponente.Destroy freigeben?
Morgen,
ich hab mir eine Klasse gebaut welche im private-Teil eine Variable (FCookies) enthält die im contructor erstellt wird (eine ObjectList). Jetzt muss ich die Variable ja auch im Destructor freigeben. Dann bekomme ich aber genau bei Fcookies.free; eine Exception. Wo liegt das Problem?
Delphi-Quellcode:
Schöne Grüße,
constructor TCookieManager.Create(AOwner: TComponent);
begin inherited Create(AOwner); FCookies := TObjectList.Create(True); end; destructor TCookieManager.Destroy; begin FCookies.Free; inherited Destroy; end; Andy |
Re: ObjectList in Komponente.Destroy freigeben?
Hallo,
ist OwnsObjects := True? Edit: wenn ich mir den Aufruf des Konstruktors lange genug anschaue: ja ist es :? Danke für's Augen öffnen @Dunkel ;) |
Re: ObjectList in Komponente.Destroy freigeben?
Hallo!
Dadurch:
Delphi-Quellcode:
wird die TObjectList zum Owner der Objekte und kümmert sich beim Freigeben automatisch um die Freigabe der Objekte in der Liste. Ich gehe davon aus, dass Du die Objekte in der TObjectList aber schon früher manuell freigibst (oder?); dann den Constructor von der TObjectList mit False aufrufen, und Du darfst Dich wieder selber ums aufräumen kümmern, ohne dass es knallt.
FCookies := TObjectList.Create(True);
|
Re: ObjectList in Komponente.Destroy freigeben?
Nein, die Objekte lösche ich nicht manuell. Der User kann zwar mit Clear und Delete(x) aufruäumen, aber die Routinen habe ich in meinen test gar nicht benutzt. Und die Objektlist sollte sich schon weiterhin selbst ums Freen kümmern. Sonst müsste ich ja in destructor eine Schleife einbauen ala
Delphi-Quellcode:
Welche Ursachen könnte es für die Exception noch geben?
for i := 0 to Count -1 do
FCookies.Items[i].Free; EDIT: Ich habe noch eine zweite Komponente die eine Eigenschaft hat um die erste Komponente zu linken. Möglicherweise wird die erste Komponente zu erst gelöscht und die Referenz der zweiten auf die erste Komponente führt ins nichts = Fehler. Warum der Debugger bei FCookies.Free; stehen bleibt ist mir dann aber ein Rätsel? |
Re: ObjectList in Komponente.Destroy freigeben?
Zitat:
|
Re: ObjectList in Komponente.Destroy freigeben?
Zitat:
Zitat:
Zitat:
|
Re: ObjectList in Komponente.Destroy freigeben?
ungültige Zeigeroperation deutet darauf hinn das etwas frei gegeben werden soll wozu kein Speicher angefordert wurde. Das passiert zum Beispiel wenn etwas schon frei gegeben wurde. Und das würde wieder für das sprechen was die anderen schon gesagt haben.
|
Re: ObjectList in Komponente.Destroy freigeben?
Ich habe jetzt OwnObjects der ObjectList auf False und es kommt kein Fehler mehr. Ich habe aber trotzdem nichts manuell gefreet. Komisch?!?
|
Re: ObjectList in Komponente.Destroy freigeben?
Zitat:
|
Re: ObjectList in Komponente.Destroy freigeben?
Zitat:
Delphi-Quellcode:
...
protected procedure Notification(AComponent: TComponent; Operation: TOperation); Override; ... implementation ... procedure TDeineKlasse.Notification(AComponent: TComponent; Operation: TOperation); begin Inherited Notification(AComponent, Operation); If ( Operation = opRemove ) And ( AComponent = fDeinReferenzMember ) Then fDeinReferenzMember := Nil; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:36 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