AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign ARC-sichere Zuweisung von self an Interface-Variable

ARC-sichere Zuweisung von self an Interface-Variable

Ein Thema von dpg123 · begonnen am 23. Mai 2017 · letzter Beitrag vom 23. Mai 2017
Antwort Antwort
Seite 1 von 2  1 2   
dpg123

Registriert seit: 13. Apr 2015
22 Beiträge
 
Turbo Delphi für Win32
 
#1

ARC-sichere Zuweisung von self an Interface-Variable

  Alt 23. Mai 2017, 16:54
Liebes Forum,

ich möchte die self-Referenz einer Interface-Variable zuordnen, ohne das automatic reference counting durcheinander zu bringen, bisher ohne Erfolg.

Hier der Code (Sinnhaftigkeit ist erstmal egal):

Delphi-Quellcode:
type

  IRequest = interface(IInterface)
  ['{AA14B3B9-9874-4E25-80BC-3C5A9A301ABC}']

    function get(): Extended;

  end;


  TRequest = class(TInterfacedObject, IRequest)

    strict private

      var

        requestValue: IRequest;

    public

      function get(): Extended;

      constructor create();

  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TRequest }

constructor TRequest.create;
begin

  inherited create();

// bei allen 3 Varianten gibts nen Memory Leak

  self.requestValue := Self;

// self.requestValue := Self as IRequest;

// self.requestValue := IRequest(self);

end;

function TRequest.get: Extended;
begin
  result := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  lReq: IRequest;

begin

  lReq := TRequest.create;

end;
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: ARC-sichere Zuweisung von self an Interface-Variable

  Alt 23. Mai 2017, 17:00
Sinn oder Unsinn mal dahingestellt, in dem Moment an dem Du einer internen Interface Variable self zuweist, wird der Referenz count dieser Variable erhöht. Wenn Du also von aussen per interface auf diese klasse zugreifst hat die mindestens einen referenzcount von 2. Du musst also um dieses Objekt freizugeben irgendeine Möglichkeit einbauen den Refernzcount wieder zu verringern.
Aber ohne den "Sinn" dieser Aktion zu kennen sehe ich keinen "Sinn" darin, darauf tiefer einzugehen. Das Konstrukt in deinem Ausgangsposting mach halt keinen .........
Fritz Westermann
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: ARC-sichere Zuweisung von self an Interface-Variable

  Alt 23. Mai 2017, 17:06
Vielleicht bringt es etwas, wenn du requestValue als weak kennzeichnest?

Delphi-Quellcode:
      var
        [weak] requestValue: IRequest;
Ob das Sinn macht, sei mal dahingestellt
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: ARC-sichere Zuweisung von self an Interface-Variable

  Alt 23. Mai 2017, 17:10
Zitat:
Vielleicht bringt es etwas, wenn du requestValue als weak kennzeichnest?
Da wir nicht wissen welcher Delphi Version der TE einsetzt können wir eh nur raten....
Fritz Westermann
  Mit Zitat antworten Zitat
dpg123

Registriert seit: 13. Apr 2015
22 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: ARC-sichere Zuweisung von self an Interface-Variable

  Alt 23. Mai 2017, 17:17
Erstmal vielen Dank für eure Beiträge!

Es scheint wirklich an der Deklaration von requestValue: IRequest in TRequest zu liegen. Deklariere ich sie in einer anderen Klasse geht es (Code siehe unten).

Ja, Sinn macht das so nicht. Hatte ich nur als Minimalbsp gewählt. Ich poste gleich mal die ausführlichere Version, dann wird es entweder klarer, oder ihr findet ne elegantere andere Lösung

[weak] kann ich nicht benutzen, da ich Turbo Delphi verwende (hab ich jetzt auch in mein Profil mal eingetragen...).

Delphi-Quellcode:
type

  IRequest = interface(IInterface)
  ['{AA14B3B9-9874-4E25-80BC-3C5A9A301ABC}']

    function get(): Extended;

  end;

  TRequestController = class(TObject)

    var

      requestValue: IRequest;

  end;


  TRequest = class(TInterfacedObject, IRequest)

    public

      function get(): Extended;

      constructor create( aRequestController: TRequestController );

  end;


  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TRequest }

constructor TRequest.create( aRequestController: TRequestController );
begin

  inherited create();

  aRequestController.requestValue := Self;

end;

function TRequest.get: Extended;
begin
  result := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  lReq: IRequest;
  lReqCon: TRequestController;
  
begin

  lReqCon := TRequestController.Create();

  lReq := TRequest.create(lReqCon);

  lReqCon.Free;

end;
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: ARC-sichere Zuweisung von self an Interface-Variable

  Alt 23. Mai 2017, 17:31
Das letzte Beispiel sollte eigentlich ohne memoryleak funktionieren, oder?
Wenn Da doch eines ist, (Turbo Delphi ist zu lange her) erzeuge einen Destructor in
TRequestController der die referenz explicit auf Nil setzte also etwa:


Delphi-Quellcode:
TRequestController.Destroy;
begin
 requestValue := nil;
  inherited;
end;
Fritz Westermann
  Mit Zitat antworten Zitat
dpg123

Registriert seit: 13. Apr 2015
22 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: ARC-sichere Zuweisung von self an Interface-Variable

  Alt 23. Mai 2017, 17:34
Das letzte Beispiel sollte eigentlich ohne memoryleak funktionieren, oder?
Wenn Da doch eines ist, (Turbo Delphi ist zu lange her) erzeuge einen Destructor in
TRequestController der die referenz explicit auf Nil setzte also etwa:


Delphi-Quellcode:
TRequestController.Destroy;
begin
 requestValue := nil;
  inherited;
end;
ja, kein Leak!
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: ARC-sichere Zuweisung von self an Interface-Variable

  Alt 23. Mai 2017, 17:36
Dann ist ja alles gut.... (Hoffe ich)
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: ARC-sichere Zuweisung von self an Interface-Variable

  Alt 23. Mai 2017, 18:04
Turbo Delphi und ARC passt aber nicht so richtig zusammen?
Und da du damit eh nur Windows-Programme erstellen kannst, ist es dem auch egal, daßß er es nicht versteht.

Das ihm "unbekannte" Attribut [Weak] sollt er sehen und dann stillschweigend ignorieren.
Und wenn er es nicht macht, dann definiert man eben ein WeakAttribute, für solch alte Delphis.


In Bezug auf ganz neue Delphis kommt da aber noch was hinzu, denn inzwischen wird [Weak] endlich auch im Non-ARC-Umfeld beachtet, also vorallem natürlich für Interfaces.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Mai 2017 um 18:07 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: ARC-sichere Zuweisung von self an Interface-Variable

  Alt 23. Mai 2017, 18:07
Blöde Frage könnte das überhaupt schon mit Attributen umgehen? Ich glaube eher an einen Compilierfehler.Aber ist zu lange her.
Fritz Westermann
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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 01:05 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