AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Wo wird der Heap von Feldvariablen von Objekten freigegeben?
Thema durchsuchen
Ansicht
Themen-Optionen

Wo wird der Heap von Feldvariablen von Objekten freigegeben?

Ein Thema von QuickAndDirty · begonnen am 23. Feb 2023 · letzter Beitrag vom 23. Feb 2023
Antwort Antwort
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#1

Wo wird der Heap von Feldvariablen von Objekten freigegeben?

  Alt 23. Feb 2023, 12:48
TObject.Destroy ist ja nun mal ohne code
TObject.Free auch (wenn man nicht im ARC modus ist)
Also brauche ich Inherited Destroy in Nachfahren auch nicht aufrufen, oder?
Delphi-Quellcode:
unit test
interface
uses System.types, classes, math, TypInfo, sysutils;
type
  TMYObject = class
  public
    owner:tobject;
    Number:Integer;
    Destructor Destroy;override;
  end;
var MYObject:tMyObject;
implementation
Destructor TMYObject.destroy;
Begin
end;

initialize
  MYObject := tMyObject.create;
  MYObject.Owner := MyObject;
  MYObject.Number := 20000;
  MYObject.free;
end.
Wie weiß Delphi (oder der Speichermanager) dass Owner und Number auf dem Heap frei sind wenn MYObject.free keinen Code ausführt?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (23. Feb 2023 um 13:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Wo wird der Heap von Feldvariablen von Objekten freigegeben?

  Alt 23. Feb 2023, 13:08
Also brauche ich Inherited Destroy in Nachfahren auch nicht aufrufen, oder?
Doch, musst du! Embarcadero wartet bloß darauf, das das jemand so macht, um bei der nächsten Version irgendeinen immens wichtigen Code dort auszuführen, der dein Programm dann crashen lässt, weil er dort nicht ausgeführt wird.

OK, Spaß beiseite. Man ruft immer (irgendjemand findet hier sicher noch eine Ausnahme) inherited Destroy auf ebenso wie inherited Create, weil man eben nicht von obigem Szenario betroffen sein möchte, falls es mal wirklich so kommt.

Wie weiß Delphi das Owner und Number auf dem Heap frei sind wenn MYObject.free keinen Code ausführt?
Create und Destroy sind nur die Stellen, wo der Delphi-Entwickler eingreifen soll/kann, z.B. wenn Felder in der Klasse auf Instanzen zeigen, die ebenfalls freigegeben werden müssen. Die eigentliche Erzeugung und Freigabe der Instanzen und deren Inhalte erfolgt in NewInstance und FreeInstance, die vom Compiler implizit aufgerufen werden (z.B. _ClassCreate und _ClassDestroy, aber das ist ein ziemlich komplexes Thema und nicht in zwei Sätzen umfassend zu beschreiben). Das unterscheidet einen constructor/destructor eben von einer normalen (class-)method eines TObjects.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Wo wird der Heap von Feldvariablen von Objekten freigegeben?

  Alt 23. Feb 2023, 14:17
Andersrum: Man kann auch einfach immer und überall inherited reinmachen, selbst wenn es noch nicht überschrieben ist.
$2B or not $2B
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wo wird der Heap von Feldvariablen von Objekten freigegeben?

  Alt 23. Feb 2023, 14:26
Also brauche ich Inherited Destroy in Nachfahren auch nicht aufrufen, oder?
Doch, musst du! Embarcadero wartet bloß darauf, das das jemand so macht, um bei der nächsten Version irgendeinen immens wichtigen Code dort auszuführen, der dein Programm dann crashen lässt, weil er dort nicht ausgeführt wird.

OK, Spaß beiseite. Man ruft immer (irgendjemand findet hier sicher noch eine Ausnahme) inherited Destroy auf ebenso wie inherited Create, weil man eben nicht von obigem Szenario betroffen sein möchte, falls es mal wirklich so kommt.

Wie weiß Delphi das Owner und Number auf dem Heap frei sind wenn MYObject.free keinen Code ausführt?
Create und Destroy sind nur die Stellen, wo der Delphi-Entwickler eingreifen soll/kann, z.B. wenn Felder in der Klasse auf Instanzen zeigen, die ebenfalls freigegeben werden müssen. Die eigentliche Erzeugung und Freigabe der Instanzen und deren Inhalte erfolgt in NewInstance und FreeInstance, die vom Compiler implizit aufgerufen werden (z.B. _ClassCreate und _ClassDestroy, aber das ist ein ziemlich komplexes Thema und nicht in zwei Sätzen umfassend zu beschreiben). Das unterscheidet einen constructor/destructor eben von einer normalen (class-)method eines TObjects.
Also wann wird _ClassDestroy aufgerufen? Es ist ne CompilerMagic sache nehme ich an so wie der RefCount bei ARC.
Wird es automatisch nach .Free eingefügt?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#5

AW: Wo wird der Heap von Feldvariablen von Objekten freigegeben?

  Alt 23. Feb 2023, 14:30
Andersrum: Man kann auch einfach immer und überall inherited reinmachen, selbst wenn es noch nicht überschrieben ist.
aber warum? Meinst du jetzt nur destructor und constructor oder wirklich "überall" ?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Wo wird der Heap von Feldvariablen von Objekten freigegeben?

  Alt 23. Feb 2023, 15:09
überall
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Wo wird der Heap von Feldvariablen von Objekten freigegeben?

  Alt 23. Feb 2023, 15:13
Ich dachte, das hätte ich deutlich gemacht.

Also wann wird _ClassDestroy aufgerufen? Es ist ne CompilerMagic sache nehme ich an so wie der RefCount bei ARC.
Wird es automatisch nach .Free eingefügt?
Genauer gesagt nach dem Destroy, weil das ein destructor ist. Das Free ist ja nur eine ganz normale Methode. Vor dem Destroy wird übrigens auch noch _BeforeDestruction aufgerufen. Diese Aufrufe sieht man nirgendwo im Quellcode, sondern der Compiler setzt sie automagisch ein.

Nein, nicht überall - zumindest nicht bedingungslos. So sollte man bei einem override von Assign nur dann das inherited aufrufen, wenn man weiß, dass die Parentklasse da noch was Sinnvolles macht. Leitet man direkt von TPersistent ab oder gibt es in der Hierarchie dazwischen kein Assign-override, dann sollte man inherited nur dann aufrufen, wenn man mit der Source nichts anfangen kann. Sinngemäß gilt das auch für AssignTo.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Wo wird der Heap von Feldvariablen von Objekten freigegeben?

  Alt 23. Feb 2023, 15:28
Nja, gundsätzlich erstmal überall, außer explizit dort, es man wirklich den Vorfahren nicht ausführen will.

Letzteres macht man bewusst.
Und so kann man es aber auch nicht vergessen, wenn man es (erstmal) standardmäßig immer macht.

Bei vererbten Forms, macht der Formdesigner auch erstmal in alle von ihm erzeugte Events rein.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:21 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