AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi ObjectList in Komponente.Destroy freigeben?
Thema durchsuchen
Ansicht
Themen-Optionen

ObjectList in Komponente.Destroy freigeben?

Ein Thema von Andreas L. · begonnen am 29. Mai 2008 · letzter Beitrag vom 29. Mai 2008
Antwort Antwort
Andreas L.
(Gast)

n/a Beiträge
 
#1

ObjectList in Komponente.Destroy freigeben?

  Alt 29. Mai 2008, 15:45
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
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#2

Re: ObjectList in Komponente.Destroy freigeben?

  Alt 29. Mai 2008, 15:48
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
  Mit Zitat antworten Zitat
Benutzerbild von Dunkel
Dunkel

Registriert seit: 26. Mär 2007
Ort: Klingenstadt
541 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: ObjectList in Komponente.Destroy freigeben?

  Alt 29. Mai 2008, 16:00
Hallo!

Dadurch:
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.
Es ist zu wahr um schön zu sein...
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#4

Re: ObjectList in Komponente.Destroy freigeben?

  Alt 29. Mai 2008, 16:07
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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: ObjectList in Komponente.Destroy freigeben?

  Alt 29. Mai 2008, 16:09
Zitat:
Dann bekomme ich aber genau bei Fcookies.free; eine Exception.
welche?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#6

Re: ObjectList in Komponente.Destroy freigeben?

  Alt 29. Mai 2008, 16:11
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
---------------------------
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: ObjectList in Komponente.Destroy freigeben?

  Alt 29. Mai 2008, 16:12
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#8

Re: ObjectList in Komponente.Destroy freigeben?

  Alt 29. Mai 2008, 16:15
Ich habe jetzt OwnObjects der ObjectList auf False und es kommt kein Fehler mehr. Ich habe aber trotzdem nichts manuell gefreet. Komisch?!?
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9

Re: ObjectList in Komponente.Destroy freigeben?

  Alt 29. Mai 2008, 18:29
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. Endlosschleife, fette Objekte etc. Das kann dauern, bis es kracht.
Gruß
Hansa
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: ObjectList in Komponente.Destroy freigeben?

  Alt 29. Mai 2008, 19:27
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;
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:42 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