AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Automatische Referenzzählug bei Interfaces

Automatische Referenzzählug bei Interfaces

Offene Frage von "himitsu"
Ein Thema von nb78 · begonnen am 21. Sep 2021 · letzter Beitrag vom 23. Sep 2021
Antwort Antwort
nb78

Registriert seit: 23. Dez 2009
6 Beiträge
 
Delphi 2010 Professional
 
#1

AW: Automatische Referenzzählug bei Interfaces

  Alt 21. Sep 2021, 15:13
Vielen Dank für die schnellen Antworten.

Das mit den Inline Variablen war mir so nicht bewußt. Ich werde es zukünftig weniger nutzen. In diesem Beispiel ist es egal aber ich nutze es gerne innerhalb von Schleifen oder Blöcken damit die Variable nur lokal nutzbar ist und nicht woanders nochmal genutzt werden kann.
Ich bin davon ausgegangen das Delphi dann den Speicher beim Verlassen des Blocks oder der Schleife automatisch freigibt. Das würde ja die "try finally free" Konstrukte sparen.
  Mit Zitat antworten Zitat
nb78

Registriert seit: 23. Dez 2009
6 Beiträge
 
Delphi 2010 Professional
 
#2

AW: Automatische Referenzzählug bei Interfaces

  Alt 21. Sep 2021, 15:16
@Günther
Ich hatte nur den minimalen Code für den Fehlerfall hochgeladen. Ansonsten hätte ich noch die ganze Umgebung inklusive Parser usw. auch liefern müssen. Das waäre dann viel Code gewesen der ja für die Lösung nicht notwendig war.

Den vollen Speichermanager werde ich mir herunterladen.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.201 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Automatische Referenzzählug bei Interfaces

  Alt 21. Sep 2021, 15:48
Ich bin davon ausgegangen das Delphi dann den Speicher beim Verlassen des Blocks oder der Schleife automatisch freigibt. Das würde ja die "try finally free" Konstrukte sparen.
Die Erklärung ist man dir etwas schuldig geblieben:

Du hast völlig Recht wenn du meinst dass eine Variable vom Typ "Interface" automatisch freigegeben wird wenn ihr Referenzzähler auf Null geht. Bei einer lokalen Variable ist das üblicherweise der Fall wenn der Gültigkeitsbereich (for-Schleife, begin/end-Block, ...) zu Ende ist.

Nicht der Fall ist das natürlich wenn die Referenz noch irgendwo anders hin weitergegeben und dort gespeichert wird.


Bei den Inline-Variablen ist hier ein Sonderfall, der eigentlich keiner ist:

Angenommen du hast eine Klasse TTerm = class(TInterfacedObject, ITerm) .
Wenn du eine lokale Variable anlegst dann kann die bspw. vom Typ TTerm oder ITerm sein. Wenn du schon ein Interface hast, dann solltest du das auch benutzen und sparst dir, wenn du eine neue Instanz anlegst, auch gleich das try..finally mit. So wie man es schon immer auch von Strings oder dynamischen Arrays kennt...

Jetzt der Stolperstein:
Wenn du bspw. sagst var meinTerm := TTerm.Create() , dann fahr doch mal später mit der Maus über meinTerm und schau was der Computer meint von welchem Typ das ist. Erstaunt? Woher soll der Computer auch wissen dass für dich ein ITerm besser wäre? Du hast ja ganz explizit TTerm.Create() gesagt.

Und Variablen vom Typ TTerm werden natürlich nicht beim Verlassen des Gültigkeitsbereichs freigegeben, das war ja schon immer so. Wir müssen jetzt also nur einen Weg finden explizit zu sagen dass die Variable bitte vom Typ Interface ist.

Es gibt zwei Möglichkeiten mit denen du den Inline-Variablen nicht abschwören musst, die sind nämlich gar nicht böse.
  1. Du gibst dem Compiler explizit vor, von welchem Typ die Variable sein soll. Das hat man ja früher in den var-Blöcken vor dem begin auch immer getan: var meinTerm: ITerm := TTerm.Create();
  2. Du verwendest einen Getter, Factory-Methode was auch immer, dessen Rückgabetyp direkt vom Typ ITerm ist
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.495 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Automatische Referenzzählug bei Interfaces

  Alt 21. Sep 2021, 16:52
Ginge nicht auch "var meinTerm := TTerm.Create() as ITerm"?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.989 Beiträge
 
Delphi 12 Athens
 
#5

AW: Automatische Referenzzählug bei Interfaces

  Alt 22. Sep 2021, 16:23
Ginge nicht auch "var meinTerm := TTerm.Create() as ITerm"?
Sicher kann man so etwas machen. Aber ich sehe den Vorteil solcher Verbiegungen nicht...

Wenn man unbedingt Inline-Variablen nehmen muss, dann sollte man zumindest auf Type Inference verzichten:
var meinTerm: ITerm := TTerm.Create;
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.495 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Automatische Referenzzählug bei Interfaces

  Alt 23. Sep 2021, 06:48
Sicher kann man so etwas machen. Aber ich sehe den Vorteil solcher Verbiegungen nicht...
Bei inline variablen sicher nicht. Wenn die variable z.B. jedoch ein member einer Klasse ist und in einer Methode dazu eine Instanz erzeugt wird, dann mache ich das gerne. So wird deutlich, dass es sich um ein Interfache handelt. Sonst könnte jemand später denken: da hat einer das Free vergessen.
(Meist werden interfaced Klassen bei uns injiziert, da steht sich die Frage gar nicht.)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Automatische Referenzzählug bei Interfaces

  Alt 23. Sep 2021, 09:23
Das bezog sich vor allem auf die "Type Inference", also wo sich die Inline-Variable den Typ automatisch aussucht, anstatt man ihn explizit angibt,
und in diesem Fall "ausversehen" unbemerkt der Klassen-Typ genommen wird, anstatt dem Interface-Typ, womit natürlich die Referenzzählung dann im Arsch ist.
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 23:41 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