![]() |
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. |
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:
|
AW: Verständnisfrage zu ARC
Ich kann als reiner Windows-Kompilierer wahrscheinlich nicht wirklich mitreden. Aber ein
Delphi-Quellcode:
mittels
c:TControl
Delphi-Quellcode:
hinzufügen und später mittels
someParentControl.AddObject(c)
Delphi-Quellcode:
und anschließendem
RemoveObject(c)
Delphi-Quellcode:
zu entfernen ist doch eigentlich genau das richtige, oder?
c.Free()
Oder wird es komplizierter wenn bsp. der Owner von
Delphi-Quellcode:
ungleich
c
Delphi-Quellcode:
gewesen wäre?
someParentControl
|
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 ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 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