AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Interfacelisten: Objekt wird bei remove freigegeben
Thema durchsuchen
Ansicht
Themen-Optionen

Interfacelisten: Objekt wird bei remove freigegeben

Ein Thema von alzaimar · begonnen am 12. Aug 2009 · letzter Beitrag vom 13. Aug 2009
Antwort Antwort
Seite 1 von 2  1 2      
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#1

Interfacelisten: Objekt wird bei remove freigegeben

  Alt 12. Aug 2009, 17:05
Folgender Code:
Delphi-Quellcode:
Type
  TTest = Class (TInterfacedObject, IInterface)
  End;

procedure TForm1.Button1Click(Sender: TObject);
Var
  l : TInterfaceList;
  x : TTest;

begin
  l := TInterfaceList.Create;
  x := TTest.Create;
  l.Add(x);
  L.Remove(x);
  x.free; // <<--- Peng. X ist schon freigeben. Wieso?
  l.free;
end;
Kann mir jemand erklären, was ich falsch mache bzw. wo mein Denkfehler liegt?
Ich müsste doch jedes Objekt selbst wieder freigeben, was ich per Create erzeuge, oder nicht?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#2

Re: Interfacelisten: Objekt wird bei remove freigegeben

  Alt 12. Aug 2009, 17:09
sowas passiert halt, wenn man Interfaces und Objekte mischt

also Objekt hat es einen Instanzzähler von 0, bei übergabe an die Interface-Variable/-Liste wird dieser auf 1 erhöht
und beim löschen/remove wieder auf 0 erniedrigt und demnach freigegeben.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Interfacelisten: Objekt wird bei remove freigegeben

  Alt 12. Aug 2009, 17:10
Die TInterfaceList ist eine Liste von Interfaces (soweit bist du wahrscheinlich schon gekommen ).
Beim .Add holt sie sich eine Referenz auf das übergebene Interface -> AddRef, Referenzzähler 1.
Beim .Remove verliert sie die Reference -> Release, Referenzzähler 0, Freigabe des Objekts.
Wie sonst auch gilt also auch hier die Regel: Interfaces und Klassen sind nur mit viel Umsicht zu vermischen. Und bei Interfaces gilt eben nicht, dass du alles mit Free freigeben musst, was du mit Create angefordert hast.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Interfacelisten: Objekt wird bei remove freigegeben

  Alt 12. Aug 2009, 17:11
Solche Fehler von einem alten Hasen

siehe auch diese Diskussion
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Interfacelisten: Objekt wird bei remove freigegeben

  Alt 13. Aug 2009, 09:10
Zitat von Bernhard Geyer:
Solche Fehler von einem alten Hasen
Ich wollte mir schon einen Alter Ego anlegen, weil mir das etwas peinlich ist , aber es ging mir in erster Linie um das Programmdesign (Create->Process->Destroy)

Mir war das mit dem Referenzzähler auch klar, ich habe nämlich entdeckt, das ich mit meinem RAD auch debuggen kann.

Die Frage ist nur, wieso ist das so implementiert? In meinen Augen ist das eine ziemliche Einschränkung der Sprache "Delphi", aber damit muss ich halt leben.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#6

Re: Interfacelisten: Objekt wird bei remove freigegeben

  Alt 13. Aug 2009, 09:22
Das ist schon OK und auch vollkommen richtig so.

Wenn du es mischen willst, dann bleiben dir grundsätzlich 2 Möglichkeiten_

- entweder du schaltest die Referenzzählung ab
und gibst selber frei, mußt dann aber auch aufpassen, daß beim Freigeben das Objetzt nicht doch nocht irgendwo benötigt wird, weil z.B. irgendwo eine Intervace-Variable noch nicht freigegeben wurde

- oder du sagst, daß du gern eine Instanz für deine Objektbehandlung hättest
Delphi-Quellcode:
l := TInterfaceList.Create;
x := TTest.Create;
x._AddRef;
l.Add(x);
L.Remove(x);
x._Release;
l.Free;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

Re: Interfacelisten: Objekt wird bei remove freigegeben

  Alt 13. Aug 2009, 09:33
Grundregel, wenn du nicht die Referenzzählung außer Kraft setzen oder anderweitig "austricksen" willst: niemals mit Objektreferenzen sondern immer mit Interfacereferenzen arbeiten, wenn dir die Referenzzählung keinen Strich durch die Rechnung machen soll
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Interfacelisten: Objekt wird bei remove freigegeben

  Alt 13. Aug 2009, 10:48
@himitsu: Auch hier gibst du durch das abschließende _Release das Objekt schon frei.
Edit: Hoppla, zu früh geschrien. Das ist ja ein l.Free am Ende.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#9

Re: Interfacelisten: Objekt wird bei remove freigegeben

  Alt 13. Aug 2009, 10:59
Zitat von Apollonius:
@himitsu: Auch hier gibst du durch das abschließende _Release das Objekt schon frei.
das ist ja auch so geplant
abgesehn, daß _Release das Objekt nicht freigibt, wenn noch irgendwo eine Referenz existiert
und durch _AddRef die InterfaceList das Objekt auch nicht freigibt, da ja der Referenzzähler danach nur von 2 auf 1 fällt und demnach nicht freigegeben wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Interfacelisten: Objekt wird bei remove freigegeben

  Alt 13. Aug 2009, 11:51
Zitat von Stevie:
Grundregel, wenn du nicht die Referenzzählung außer Kraft setzen oder anderweitig "austricksen" willst: niemals mit Objektreferenzen sondern immer mit Interfacereferenzen arbeiten, wenn dir die Referenzzählung keinen Strich durch die Rechnung machen soll
Gute Regeln können so einfach sein

Also statt

Delphi-Quellcode:
var
  L: TInterfaceList;
  X: TTest;
einfach bei den Typen öfter ein I statt eines T verwenden:

Delphi-Quellcode:
var
  L: IInterfaceList;
  X: IMyInterface;

Manche Bibliotheken funktionieren sogar besser, wenn für die Erzeugung von Instanzen Interface-Variablen benutzt werden.
Zum Beispiel kann es leicht zu Access Violations geben, wenn man für eine dynamisch erzeugte TXMLDocument Instanz den Variablentyp IXMLDocument (statt TXMLDocument) benutzt. (siehe http://edn.embarcadero.com/article/29241).



Cheers,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:40 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