Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verständnisfrage zu ARC (https://www.delphipraxis.net/177344-verstaendnisfrage-zu-arc.html)

Daniel 2. Nov 2013 09:16

AW: Verständnisfrage zu ARC
 
Nein, das mit dem Free und DisposeOf haut nicht hin.
".DisposeOf" ändert den Referenz-Zähler nicht. Es führt lediglich den Code aus, der im Destruktor enthalten ist - degradiert damit den Destruktor fast zu einer normalen Methode. Das Objekt lebt danach noch - zumindest aus technischer Sicht, selbst wenn es fachlich vielleicht nicht mehr in der Lage sein mag, einer sinnvollen Tätigkeit nachzukommen.

Zudem setzt .DisposeOf() ein Flag, das höchstwertige Bit des Referenz-Zählers. Danach hast Du auf jeden Fall ein RefCount von >= 2^32.

Man spricht davon, dass das Objekt sich dann in einer Art "Zombie-Zustand" befindet.

Ich zitiere mal aus dem DocWIKI:
Ein Weg der Betrachtung der Unterschiede zwischen Free und DisposeOf liegt in der Berücksichtigung des Zwecks. Free wird zu dem Zweck verwendet, dass eine bestimmte Referenz von einer Instanz getrennt werden soll. Dabei ist eine Freigabe des Objekts oder von Speicher nicht impliziert. Im Gegensatz dazu teilt der Programmierer mit DisposeOf der Instanz explizit mit, "sich selbst zu bereinigen". Eine Speicherfreigabe ist dabei nicht notwendigerweise impliziert, DisposeOf führt eine explizite "Vorbereinigung" der Instanz durch. Anschließend ist die Instanz von der normalen Referenzzählungssemantik abhängig, die die Instanz dann schließlich freigeben kann.

Union 2. Nov 2013 09:28

AW: Verständnisfrage zu ARC
 
Na dann bin ich ja froh dass ich jetzt weiss woher die fiesen Firemonkey-Speicherlecks kommen. Ich hab aber immer noch nicht verstanden wie ich Source wie z.b. in dem ersten Beitrag dieses Threads Mukltiplattformsicher bekomme - und das möglichst ohne Compiler-Defines wie NEXTGEN, AUTOREFCOUNT usw. abzufragen.

Konkretes Ziel war:
  • Erzeugen einer Komponente zur Laufzeit
  • Entfernen der Komponente zur Laufzeit
  • Zustand des Speichers nach dem Entfernen soll so sein wie vor dem Erzeugen

Der schöne Günther 2. Nov 2013 19:26

AW: Verständnisfrage zu ARC
 
Ich kann als reiner Windows-Kompilierer wahrscheinlich nicht wirklich mitreden. Aber ein
Delphi-Quellcode:
c:TControl
mittels
Delphi-Quellcode:
someParentControl.AddObject(c)
hinzufügen und später mittels
Delphi-Quellcode:
RemoveObject(c)
und anschließendem
Delphi-Quellcode:
c.Free()
zu entfernen ist doch eigentlich genau das richtige, oder?

Oder wird es komplizierter wenn bsp. der Owner von
Delphi-Quellcode:
c
ungleich
Delphi-Quellcode:
someParentControl
gewesen wäre?

Sir Rufo 2. Nov 2013 22:21

AW: Verständnisfrage zu ARC
 
Sobald ARC im Spiel ist, läuft IMHO ein Free ins Leere (ein Blick in die Quellen liefert da Erkenntnis).

Mein Favorit wäre hier eigentlich Delphi-Referenz durchsuchenTFmxObject.Release


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 Uhr.
Seite 2 von 2     12   

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