AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Interfaces in lokalen Variablen und deren Freigabe
Thema durchsuchen
Ansicht
Themen-Optionen

Interfaces in lokalen Variablen und deren Freigabe

Offene Frage von "jaenicke"
Ein Thema von swestner · begonnen am 24. Aug 2021 · letzter Beitrag vom 25. Aug 2021
Antwort Antwort
Seite 2 von 2     12   
Der schöne Günther

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

AW: Interfaces in lokalen Variablen und deren Freigabe

  Alt 25. Aug 2021, 15:12
Ich verstehe das überhaupt nicht, ich bin allerdings auch nicht so schlau.

Weshalb gibt man eine nicht initialisierte Referenz als var-Parameter in den Konstruktor, speichert sich den und drückt dann dort ein nil rein?

Du siehst doch schon in deinem Destruktor von TMyInterfacedObject dass da Schrott drinsteht und versuchst den dann freizugeben.

Das ist allerdings tatsächlich nur der Fall wenn die anonyme Methode im Spiel ist.

Die anonyme Methode "captured" deine lokale Variable "list". Die wandert dann irgendwie anderswo auf den Heap und der komische Trick mit den Zeigeradressen scheint nicht mehr zu funktionieren. Auch für den blöden Debugger ist die lokale Variable "list" unsichtbar.

Geändert von Der schöne Günther (25. Aug 2021 um 15:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Interfaces in lokalen Variablen und deren Freigabe

  Alt 25. Aug 2021, 16:23
Stimmt, da hast du Recht. Ich habe es nur laufen lassen und gar nicht genauer angeschaut. Die beiden Zeilen machen in der Reihenfolge natürlich keinen Sinn:
Delphi-Quellcode:
  intf := TMyInterfacedObject.Create( TObject(list) );
  list := TStringList.Create;
Richtig wäre:
Delphi-Quellcode:
  list := TStringList.Create;
  intf := TMyInterfacedObject.Create( TObject(list) );
Ach ja... hier gibt es übrigens eine bessere Lösung für dieses Problem:
https://blog.grijjy.com/2020/08/12/c...mart-pointers/

Denn die Herangehensweise aus dem obigen Beispielprojekt macht wenig Sinn, da man so z.B. bei asynchron ausgeführten anonymen Methoden Fehler bekommt, weil das Interface eigentlich gar nichts mit dem Objekt zu tun hat. Dann ist es sinnvoller das Objekt direkt freizugeben...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke (25. Aug 2021 um 16:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Interfaces in lokalen Variablen und deren Freigabe

  Alt 25. Aug 2021, 16:48
gelöscht
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
swestner

Registriert seit: 31. Aug 2012
Ort: Hallstadt
78 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: Interfaces in lokalen Variablen und deren Freigabe

  Alt 25. Aug 2021, 17:08
@jaenicke:
Ich denke, das Ganze macht doch Sinn...

Ziel des ganzen Konstrukts ist, daß ich nicht in jeder Methode alle dynamisch angelegten Variablen mit try..finally absichern muß.

Die Variable wird im VAR-Teil deklariert und dann der Pointer auf diese Variable in dem InterfaceObject gespeichert. Dabei spielt es keine Rolle, ob in der Variable schon was drin steht (Objekt) oder nicht.

Später wird dann der Variable ein Objekt zugewiesen.

Wenn die Methode verlassen wird, wird das Interface zerstört und dann werden im Destruktor alle Objekte in den lokalen Variablen zerstört.

Das funktioniert in unserem Programmcode tausende Mal so.

Haben wir übrigens nicht selbst erfunden sondern BoldSoft / Borland schon 2004.

Jetzt die Frage:
Kann das nach dem gleichen Prinzip 2021 besser realisiert werden?
Warum macht die anonyme Methode das "System" kaputt?

Stefan
Stefan Westner

Geändert von swestner (25. Aug 2021 um 17:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Interfaces in lokalen Variablen und deren Freigabe

  Alt 25. Aug 2021, 18:12
Durch die Verwendung von list in der Anonymen Methode wird die Instanz von list durch das Variable Binding intern verschoben und die in FObjectPtrs gespeicherte Referenz enthält ab dann ungültige Daten.

Man kann das schön im Debugger sehen: Außerhalb von TestAnonymProc kann er list nicht auflösen, innerhalb schon.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Interfaces in lokalen Variablen und deren Freigabe

  Alt 25. Aug 2021, 22:20
@jaenicke:
Ich denke, das Ganze macht doch Sinn...

Ziel des ganzen Konstrukts ist, daß ich nicht in jeder Methode alle dynamisch angelegten Variablen mit try..finally absichern muß.
Ja, schon, aber wozu die Pointer? Eine Objektreferenz ist doch per se schon ein Pointer. Ein Pointer auf einen Pointer macht an der Stelle keinen Sinn.

Kann das nach dem gleichen Prinzip 2021 besser realisiert werden?
Ja, so wie ich es verlinkt habe. Smart Pointers ist das Stichwort. Die machen genau das, nur deutlich sinnvoller.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 10:48 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