Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Weak-Referenzen im Windows (https://www.delphipraxis.net/204423-weak-referenzen-im-windows.html)

himitsu 27. Mai 2020 20:42

Delphi-Version: 10.4 Sydney

Weak-Referenzen im Windows
 
Wurde das jetzt erst repariert, oder geht das schon länger?
[EDIT] im 10.3.3 geht es auch schon.

Weiß zufällig wann das repariert wurde?
Hatte es damals, vor vielen Jahren ausprobiert und gefrusstet die letzten Jahre sinnlos ersatzweise weiterhin böse in Pointer gecastet. :oops:

War jetzt wieder auf die Idee gekommen, da in 10.4 das Speichermanagement etwas geändert wurde.
> unified memory management

Als ich es das letzte Mal versuchte, da ging es nur im NextGen und der Windows-Compiler hatte das [Weak] einfach so und ohne Warnung ignoriert.
Delphi-Quellcode:
type
  TTest = class(TInterfacedObject)
    destructor Destroy; override;
  end;

destructor TTest.Destroy;
begin
  ShowMessage('bin weg');
  inherited;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
  I1: IInterface;
  [Weak] I2: IInterface;
begin
  I1 := TTest.Create;
  I2 := I1;
  I1 := nil; // hier wird das Interface/Objekt freigegeben und I2 auf NIL gesetzt
  if Assigned(I2) then
    ShowMessage('och nö');
end;


PS: die Klassenverfollständigung mag keine Attribute. :shock:

Delphi-Quellcode:
type
  TTest = class(TInterfacedObject)
    destructor Destroy; override; // hier der Cursor und Strg+Shift+C
  end;

procedure TForm2.FormCreate(Sender: TObject);
var
  I1: IInterface;
  [Weak] I2: IInterface;
begin
  I1 :=
end;
und raus kommt das
Delphi-Quellcode:
type
  TTest = class(TInterfacedObject)
    destructor Destroy; override;
  end;

procedure TForm2.FormCreate(Sender: TObject);
var
  I1: IInterface;
  [Weak] I2: IInterface;
{ TTest }

destructor TTest.Destroy;
begin

  inherited;
end;

begin
  I1 :=
end;

jaenicke 27. Mai 2020 21:49

AW: Weak-Referenzen im Windows
 
Zitat:

Zitat von himitsu (Beitrag 1465577)
Wurde das jetzt erst repariert, oder geht das schon länger?
[EDIT] im 10.3.3 geht es auch schon.

TInstItem.ClearWeakRefs, in dem die Weak-Referenzen auf nil gesetzt werden, ist zumindest in den letzten Versionen unverändert geblieben (wie übrigens der größte Teil der System Unit).

himitsu 27. Mai 2020 23:22

AW: Weak-Referenzen im Windows
 
Im NextGen (Android) ging es damals (2013 ... man, schon wieder lange her) ja schon, aber im Windows-Compiler wurde es Anfangs scheinbar nicht implementiert, oder es gab einen Bug.

Für TObject war es ja sowieso nicht drin, da das nur im NextGen wie ein Interface reagierte,
aber als ich versuchte das für IInterface zu benutzen, da reagierte Win32 mit und ohne [Weak] gleich/unverändert.

Aber da das Feature ja für ARC erfunden wurde, war es irgendwie "verständlich", dass es im WindowsCompiler nicht ging und ich hatte nicht wieder danacht gesehn, dazumal ich auch nichts wieder drüber zu hören war, dass/ob sich was geändert hat.

Stevie 28. Mai 2020 09:06

AW: Weak-Referenzen im Windows
 
https://blog.marcocantu.com/blog/201...eferences.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 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