Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz

  Alt 26. Jan 2021, 17:04
Die Delphi-Klassen werden vor Create erzeugt.
Stell dir einfach vor das Erstellen passiert im ersten BEGIN jedes CREATE, wenn die Klasse zu dem Zeitpunkt noch nicht initialisiert wurde, dann wird NewInstance ausgeführt.

Das Selbe ist übrigens auch beim Destructor, wo quasi im END die Klasse gelöscht wird.
Im Constructor/Destructor werden dann nur noch Dinge innerhalb der Klasse geregelt, wie z.B. erstellen/freigeben von Variablen der Klasse, aber nicht die Klasse selbst.

Und ja, es sollte zwar nicht, aber es "kann" auch die Ausfühung der Constructor/Destructor des Vorfahren übersprungen werden, indem kein Inherited aufgerufen wird.
(z.B. wenn die Nachfolgeklasse etwas ganz anders machen will und diesen Teil des Vorfahren "entfernt" und es dann eventuell selber/anders löst)
Normalerweise ist in TObjekt dort auch kein Code drin, warum es "meistens" nicht stört,
aber ja, per se sollte man immer ein Inherited machen, auch wenn "aktuell" im Vorfahren nichts drin ist .... wer weiß ob es sich mal ändern wird.




Ach ja, .Free hat bereits ein If-Assigned eingebaut.
Dein if iniFile <> nil then ist somit nutzlos (auch wenn es nicht stört, wenn doppelt geprüft wird)
PS: Das ist auch einer der Gründe, warum man Free aufrufen soll, und nicht direkt Destroy.

PS: Free tut im ARC garnichts. (dort wird/wurde nur über den Referenzzähler freigegeben, ähnlich wie bei den Interfaces ... als funktionierender Ersatz wurde dafür dann das DisposeOf erfunden, anstatt das "abweichende" Verhalten in eine "neue" Funktion zu verlagen )




Das normale TIniFile/TCustomIniFile macht im Constructor/Destructor eigentlich garnichts,
denn alle Arbeit nur innerhalb jeder einzelnen Read/Write-Methode erledigt wird.
Das UpdateFile im Destructor macht daher bei der normalen Windows-TIniFile ebenfalls nichts. (der Aufruf ist dort nur für die Ableitungen ala TMemIniFile drin enthalten)

Wenn etwas sich automatisch freigibt, dann brauch ich es nur erstellen (das muß nicht im Constructor gemacht werden, sondern kann auch erst beim ersten Zugriff passieren) und nicht wieder freigeben.
-> ein eigener Destrucor ist dann nicht nötig
Und wenn man etwas erst später erstellt, dann ist dafür auch kein eigener Constructor nötig.
$2B or not $2B

Geändert von himitsu (26. Jan 2021 um 18:19 Uhr)
  Mit Zitat antworten Zitat