Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Free im Constructor erlaubt/möglich? (https://www.delphipraxis.net/130651-free-im-constructor-erlaubt-moeglich.html)

himitsu 11. Mär 2009 18:38


Free im Constructor erlaubt/möglich?
 
N'abend ihr. :hi:

Gibt es da Probleme, bzw. sollte/kann man dieses anders lösen?
(hab's noch nicht getestet, aber ich wüßte nicht, warum es nicht gehn sollte)

Der Grund ist einfach, daß innerhalb des Contructors oder darin aufgerufener Prozeduren Exceptions geworfen werden könnten
und ich ein Speicherleck verhindern möchte.

im Prinzip hab ich es erstmal so implementiert:
Delphi-Quellcode:
Constructor TXMLAttributes.Create(...);
  Begin
    Inherited Create;
    Try
      ...
    Except
      Free;
      Raise;
    End;
  End;
praktisch wird (es soll zumindestens) das Objekt wieder freigegeben, wenn es nicht ordnungsgemäß erstellt werden konnte.

himi :angel:

Muetze1 11. Mär 2009 18:40

Re: Free im Constructor erlaubt/möglich?
 
Um den Constructor abzubrechen und damit die Freigabe des in der Instanziierung befindlichen Objektes zu erreichen, ist nur durch werfen (oder re-raise) einer Exception möglich.

Somit auf deinen Code angewandt: Das Free wird automatisch vom Compiler gemacht, da du eine Exception im Constructor wirfst. Von daher ist der gesamte try/except Block unnötig, da es ohne diesen schon alles so macht wie du es wünscht.

himitsu 11. Mär 2009 19:03

Re: Free im Constructor erlaubt/möglich?
 
Na das ist ja practisch, aber wie sollte man denn darauf kommen :shock:

jaenicke 11. Mär 2009 19:11

Re: Free im Constructor erlaubt/möglich?
 
Das ist der Grund, warum die Erzeugung und Verwendung eines Objekts normalerweise so aussieht:
Delphi-Quellcode:
xy := Txy.Create;
try
  ...
finally
  xy.Free;
end;
Wenn im Konstruktor eine Exception auftritt, dann wird automatisch das Objekt wieder aufgeräumt. Wenn danach eine auftritt, dann muss man diese abfangen. ;-)

sirius 11. Mär 2009 19:12

Re: Free im Constructor erlaubt/möglich?
 
Zitat:

Zitat von Delphi Hilfe
Der Konstruktor erzeugt ein Objekt und initialisert dessen Daten.

Delphi-Syntax:

constructor Create;

Beschreibung

Create erstellt ein Objekt. Der Zweck, die Größe und das Verhalten von Objekten ist sehr unterschiedlich. Der von TObject definierte Konstruktor Create weist Speicher zu, initialisiert aber keine Daten.

Abgeleitete Objekte definieren normalerweise einen Konstruktor, der bei der Erzeugung eines bestimmten Objekttyps die Daten in geeigneter Weise initialisiert.

Hinweis: Wenn ein Konstruktor eine Exception nicht behandelt, wird der Destruktor des Objekts aufgerufen, um die fehlerhafte Instanz zu beseitigen.

:zwinker:

Muetze1 11. Mär 2009 19:14

Re: Free im Constructor erlaubt/möglich?
 
Zitat:

Zitat von himitsu
Na das ist ja practisch, aber wie sollte man denn darauf kommen :shock:

Na in die Hilfe schauen:
Zitat:

Zitat von RAD2007 Studio
If an exception is raised during execution of a constructor that was invoked on a class reference, the Destroy destructor is automatically called to destroy the unfinished object.


himitsu 11. Mär 2009 19:26

Re: Free im Constructor erlaubt/möglich?
 
Zitat:

Zitat von jaenicke
Das ist der Grund, warum die Erzeugung und Verwendung eines Objekts normalerweise so aussieht:
...
Wenn im Konstruktor eine Exception auftritt, dann wird automatisch das Objekt wieder aufgeräumt. Wenn danach eine auftritt, dann muss man diese abfangen. ;-)

das ist aber noch kein Hinweis darauf, daß das Object dabei freigegeen wird.

Funktionsergebnisse werden bei einer Exceptions nur mehr zugewiesen, also selbst wenn das Objekt nicht bei einer Exception freigegeben würde, würde dennoch keine Referenz an die Variable übergeben.

Und wenn da nun nichts innerhalb des Objektes freigegeben würde, dann würde das Objekt nun ohne irgendeine Referenz darauf irgendwo rumliegen.

Zitat:

Zitat von Muetze1
Na in die Hilfe schauen:

dafür müßte man erstmal damit rechnen, daß da was derartig behandelt werden würde ... hatte ich aber nicht, also hab ich auch nicht nachgeschaut :oops:

nja, dann ist das (nichtvorhandene) Problem ja behoben :angel2:

Danke :angel:

mkinzler 11. Mär 2009 19:28

Re: Free im Constructor erlaubt/möglich?
 
Zitat:

... das ist aber noch kein Hinweis darauf, daß das Object dabei freigegeen wird. ...
Ich Verstehe mal Aufräumen als Freigabe
Zitat:

... dann wird automatisch das Objekt wieder aufgeräumt. ...

himitsu 11. Mär 2009 19:32

Re: Free im Constructor erlaubt/möglich?
 
Zitat:

Zitat von mkinzler
Zitat:

... das ist aber noch kein Hinweis darauf, daß das Object dabei freigegeen wird. ...
Ich Verstehe mal Aufräumen als Freigabe
Zitat:

... dann wird automatisch das Objekt wieder aufgeräumt. ...

das bezog sich mehr auf die Begründung
Zitat:

Das ist der Grund, warum die Erzeugung und Verwendung eines Objekts normalerweise so aussieht:
nur weil das so gemacht wird, ist das kein Hinweis darauf, daß es automatisch freigegeben wird.

(wie oben nacheditiert) würde bei einer Exception so oder so das Funktionsergebnis (hier die Objektreferenz) NICHT an die Variable übergeben, also könnte man eh nicht diese Variable nehmen um das ganze Freizugeben ...

Muetze1 11. Mär 2009 22:02

Re: Free im Constructor erlaubt/möglich?
 
Zitat:

Zitat von himitsu
(wie oben nacheditiert) würde bei einer Exception so oder so das Funktionsergebnis (hier die Objektreferenz) NICHT an die Variable übergeben, also könnte man eh nicht diese Variable nehmen um das ganze Freizugeben ...

Nein, Denkfehler: Wenn der Constructor eine Exception wirft, dann kommt es erst gar nicht mehr zur Zuweisung der Objektvariablen, weil er schon vorher aussteigt. Von daher ist die Objektvariable unverändert und da es vor dem Try geschieht, wandert er die Aufrufkette hoch zur nächsten Exceptionbehandlung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 Uhr.
Seite 1 von 2  1 2      

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