AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi RefCount nach Erstellung von TInterfacedObject gleich 0

RefCount nach Erstellung von TInterfacedObject gleich 0

Ein Thema von s.h.a.r.k · begonnen am 13. Jan 2012 · letzter Beitrag vom 13. Jan 2012
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: RefCount nach Erstellung von TInterfacedObject gleich 0

  Alt 13. Jan 2012, 15:05
Die Referenzzählung erfolgt IMHO erst dann, wenn die Instanz zu einer Interface-Variablen zugeordnet wird.

Probier es mal so
Delphi-Quellcode:
class function TStartupManagerFactory.Create(): IStartupProcess;
var
  StartupProcess : TBaseStartupProcess;
begin
  StartupProcess := TBaseStartupProcess.Create();
  Result := StartupProcess;
  AddStartupCommands(StartupProcess); // Hier mal den Haltepunkt setzen und prüfen
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: RefCount nach Erstellung von TInterfacedObject gleich 0

  Alt 13. Jan 2012, 16:11
So solte das doch eigentlich funktionieren
Delphi-Quellcode:
class function TStartupManagerFactory.Create(): IStartupProcess;
begin
  Result := TBaseStartupProcess.Create();
  AddStartupCommands( TBaseStartupProcess( Result ) );
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: RefCount nach Erstellung von TInterfacedObject gleich 0

  Alt 13. Jan 2012, 16:48
So solte das doch eigentlich funktionieren
Wenn hier nicht zufällig ein bissl Compilermagic mitspielt, dann definitiv NEIN.

Ein Interface-Zeiger ist kein Objekt-Zeiger, also kann man das nicht einfach so billig umcasten.

Zitat von mjustin:
Natürlich, aber irgendwo muss halt doch eine implementierende Klasse instanziiert werden.
Wo kann etwas schiefgehen, wenn man wie im Beispiel der Factoryklasse, die erzeugte Instanz temporär in einer lokalen Variable speichert?
Möglichst direkt in die Interfacevariable reinerstellen.

Sobald man auch nur eine Interfacevariable erstellt ht, ist die Zuferlässigkeit von Objektzeigern nicht mehr gegeben, da das Objekt vorzeitig/ungewollt über die Interface-Referenzzählung freigegeben werden könnte.

Aus diesem Grund hatte ich vor eine Weile angefangen eine Hybride zu erstellen, welche die Interfacereferenzen und Objektreferenzen gleichermaßen beachtet.
Leider ist das in Delphi (speziell die Erstellung des Objektes) nicht komplett und sicher umsetzbar,
da man nicht automatisch erkennen kann, ob das erstellte Objekt, bei x := TIrgendwas.Create; direkt in eine Interfacevariable geht oder ob das eine Objektvariable ist. (also um was es sich beim X handelt)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (13. Jan 2012 um 16:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: RefCount nach Erstellung von TInterfacedObject gleich 0

  Alt 13. Jan 2012, 16:59
So solte das doch eigentlich funktionieren
Wenn hier nicht zufällig ein bissl Compilermagic mitspielt, dann definitiv NEIN.

Ein Interface-Zeiger ist kein Objekt-Zeiger, also kann man das nicht einfach so billig umcasten.
Oh, dann habe ich wohl das Hummel-Syndrom ... denn das wusste ich nicht.
Aus diesem Grunde mache ich das so ... und es funktioniert

Also, das sollte nicht nur, sondern das Casten funktioniert genau so.

Eine Hummel kann eigentlich gar nicht fliegen, da die Flügel viel zu klein für ihr Gewicht sind.
Da die Hummel das nicht weißt, fliegt sie einfach.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: RefCount nach Erstellung von TInterfacedObject gleich 0

  Alt 13. Jan 2012, 17:06
Dann ist das ein Problem der versteckten Compilermagic.
Wenn der Compiler diesen Cast intern in eine Supports-Anfrage ändert, dann geht das natürlich.


Schade, daß man nicht sieht, ob/wo die Compilermagic einem einen "Streich" speielt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.679 Beiträge
 
Delphi 12 Athens
 
#6

AW: RefCount nach Erstellung von TInterfacedObject gleich 0

  Alt 13. Jan 2012, 17:42
Der saubere Weg seit D2010 ist as : http://docwiki.embarcadero.com/RADSt...zen_in_Objekte

Zitat:
Mit dem Operator as kann auch eine Typumwandlung einer Interface-Referenz zurück in das Objekt durchgeführt werden, aus dem sie ermittelt wurde. Diese Typumwandlung gilt für Interfaces, die aus Delphi-Objekten ermittelt wurden.
Aber auch Sir Rufo's Methode geht:

Zitat:
Sie können auch eine normale (unsichere) Typumwandlung einer Interface-Referenz in ein Objekt vornehmen. Diese Methode löst keine Exceptions aus. Der Unterschied zwischen der unsicheren Objekt-in-Objekt-Typumwandlung in der unsicheren Interface-in-Objekt-Typumwandlung ist folgender: die erste Typumwandlung gibt bei inkompatiblen Typen einen gültigen Zeiger zurück, die zweite gibt nil zurück.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#7

AW: RefCount nach Erstellung von TInterfacedObject gleich 0

  Alt 13. Jan 2012, 21:57
Die Referenzzählung erfolgt IMHO erst dann, wenn die Instanz zu einer Interface-Variablen zugeordnet wird.

Probier es mal so
Delphi-Quellcode:
class function TStartupManagerFactory.Create(): IStartupProcess;
var
  StartupProcess : TBaseStartupProcess;
begin
  StartupProcess := TBaseStartupProcess.Create();
  Result := StartupProcess;
  AddStartupCommands(StartupProcess); // Hier mal den Haltepunkt setzen und prüfen
end;
Jup, das hatte ich schon -- siehe den Screenshot

Die Information, dass diese Interface-Zeiger besondere Zeiger sind, wusste ich bisher (leider) noch nicht. Das ändert natürlich die Sachlage etwas danke an euch alle, vor allem die gesamte Diskussion drum herum!
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: RefCount nach Erstellung von TInterfacedObject gleich 0

  Alt 13. Jan 2012, 22:19
Die Information, dass diese Interface-Zeiger besondere Zeiger sind, wusste ich bisher (leider) noch nicht.
Das ist grade der Sinn von Interfaces. (also einer davon)

Erstmal Trennung von Schnittstelle und Code.
> Man muß nur die Schnittstelle (die Interfacedeklaration) kennen und es ist unwichtig, was sich dahinter versteckt. (bzw. man muß nicht das Innere verraten)

Und die Freigabe regelt das Interface selber.
> Es zählt wie oft es verwendet wird (wieviele Variablen auf es zeigen) und wenn keiner mehr drauf zeigt, gibt es sich selber frei.
> Bei wird die Freigabe extern geregelt ... irgendwer ruft Free auf (wobei es nicht beachtet wird, ob noch eine andere Variable drauf zeigen könnte ... btw. niemand weiß wie oft was verlinkt wird)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:50 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