AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Free im Constructor erlaubt/möglich?

Ein Thema von himitsu · begonnen am 11. Mär 2009 · letzter Beitrag vom 12. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von himitsu
himitsu

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

Free im Constructor erlaubt/möglich?

  Alt 11. Mär 2009, 18:38
N'abend ihr.

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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Free im Constructor erlaubt/möglich?

  Alt 11. Mär 2009, 18:40
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Free im Constructor erlaubt/möglich?

  Alt 11. Mär 2009, 19:03
Na das ist ja practisch, aber wie sollte man denn darauf kommen
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.330 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Free im Constructor erlaubt/möglich?

  Alt 11. Mär 2009, 19:11
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Free im Constructor erlaubt/möglich?

  Alt 11. Mär 2009, 19:12
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Free im Constructor erlaubt/möglich?

  Alt 11. Mär 2009, 19:14
Zitat von himitsu:
Na das ist ja practisch, aber wie sollte man denn darauf kommen :shock:
Na in die Hilfe schauen:
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Free im Constructor erlaubt/möglich?

  Alt 11. Mär 2009, 19:26
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 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

nja, dann ist das (nichtvorhandene) Problem ja behoben

Danke
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Free im Constructor erlaubt/möglich?

  Alt 11. Mär 2009, 19:28
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. ...
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Free im Constructor erlaubt/möglich?

  Alt 11. Mär 2009, 19:32
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 ...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: Free im Constructor erlaubt/möglich?

  Alt 11. Mär 2009, 22:02
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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