Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ObjectList in Komponente.Destroy freigeben? (https://www.delphipraxis.net/114690-objectlist-komponente-destroy-freigeben.html)

Andreas L. 29. Mai 2008 14:45


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:
constructor TCookieManager.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCookies := TObjectList.Create(True);
end;

destructor TCookieManager.Destroy;
begin
  FCookies.Free;
  inherited Destroy;
end;
Schöne Grüße,
Andy

s-off 29. Mai 2008 14:48

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 ;)

Dunkel 29. Mai 2008 15:00

Re: ObjectList in Komponente.Destroy freigeben?
 
Hallo!

Dadurch:
Delphi-Quellcode:
FCookies := TObjectList.Create(True);
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.

Andreas L. 29. Mai 2008 15:07

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:
for i := 0 to Count -1 do
  FCookies.Items[i].Free;
Welche Ursachen könnte es für die Exception noch geben?

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?

SirThornberry 29. Mai 2008 15:09

Re: ObjectList in Komponente.Destroy freigeben?
 
Zitat:

Dann bekomme ich aber genau bei Fcookies.free; eine Exception.
welche?

Andreas L. 29. Mai 2008 15:11

Re: ObjectList in Komponente.Destroy freigeben?
 
Zitat:

Zitat von SirThornberry
Zitat:

Dann bekomme ich aber genau bei Fcookies.free; eine Exception.
welche?

Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project4.exe ist eine Exception der Klasse EInvalidPointer mit der Meldung 'Ungültige Zeigeroperation' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Zitat:

---------------------------
Anwendungsfehler
---------------------------
Exception EInvalidPointer in Modul Project4.exe bei 00003809.

Ungültige Zeigeroperation.


---------------------------
OK
---------------------------


SirThornberry 29. Mai 2008 15:12

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.

Andreas L. 29. Mai 2008 15:15

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?!?

Hansa 29. Mai 2008 17:29

Re: ObjectList in Komponente.Destroy freigeben?
 
Zitat:

Zitat von Andreas L.
Ich habe jetzt OwnObjects der ObjectList auf False und es kommt kein Fehler mehr... Komisch?!?

Warum komisch ? Wenn schon, dann mülle den Speicher mal so richtig zu. :mrgreen: Endlosschleife, fette Objekte etc. :shock: Das kann dauern, bis es kracht.

Muetze1 29. Mai 2008 18:27

Re: ObjectList in Komponente.Destroy freigeben?
 
Zitat:

Zitat von Andreas L.
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?

Du wirst durch die VCL darüber informiert:

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