AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Objekte in Klassen: Was wird alles zerstört?
Thema durchsuchen
Ansicht
Themen-Optionen

Objekte in Klassen: Was wird alles zerstört?

Ein Thema von malo · begonnen am 27. Nov 2005 · letzter Beitrag vom 27. Nov 2005
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: Objekte in Klassen: Was wird alles zerstört?

  Alt 27. Nov 2005, 11:35
Zitat von malo:
Zitat von GuenterS:
Hm Du solltest im Destructor von SuperKlasse auch nur Klasse B freigeben (mit Free), dadurch wird der Destructor der Klasse B aufgerufen wo Du dann Klasse A freigeben kannst.
Aber ich krieg auch eine Exception, wenn ich KlasseB freigeben will. Das ist das seltsame...

Zitat von GuenterS:
Poste doch mal den Code, womit Du Probleme hast, dann kann man sicher leichter helfen.
Wollte ich eigentlich auch machen, allerdings sitze ich grade am falschen Rechner und hab keinen Zugriff auf meine Sourcen. Daher hab ich versucht das Problem mit meinem Beispiel oben zu beschreiben. Wenn ich wieder an meinem PC bin, werd ich den entspr. Source posten

Ich gehe davon aus, dass Du KlasseB auch erzeugt hast in SuperKlasse?

Delphi-Quellcode:
constructor TSuperKlasse.create;
begin
  ...
  KlasseB := TKlasseB.Create;
end;
...

destructor TSuperKlasse.destroy;
begin
  KlasseB.Free;
  ...
end;
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#12

Re: Objekte in Klassen: Was wird alles zerstört?

  Alt 27. Nov 2005, 11:37
Der Fehler beim Freigeben von Klasse B liegt vielleicht daran dass der Inhalt des Pointers auf KlasseB schon geleert wurde. Jedenfalls wird die Klasse nicht freigegeben:

Delphi-Quellcode:
var
  a:array[1..1000000] of tsuperklasse;
  i:integer;
begin
  for i:=low(a) to high(a) do begin
    sk:=tsuperklasse.Create;
    sk.klasseb:=tklasseb.create;
    sk.klasseb.klassea:=tklassea.Create;
    sk.Free;
  end;
end;
Der RAM-Verbrauch der Anweundung steigt jedesmal um einige MB an.
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Objekte in Klassen: Was wird alles zerstört?

  Alt 27. Nov 2005, 11:42
Zitat von ichbins:
Der Fehler beim Freigeben von Klasse B liegt vielleicht daran dass der Inhalt des Pointers auf KlasseB schon geleert wurde. Jedenfalls wird die Klasse nicht freigegeben:

Delphi-Quellcode:
var
  a:array[1..1000000] of tsuperklasse;
  i:integer;
begin
  for i:=low(a) to high(a) do begin
    sk:=tsuperklasse.Create;
    sk.klasseb:=tklasseb.create;
    sk.klasseb.klassea:=tklassea.Create;
    sk.Free;
  end;
end;
Der RAM-Verbrauch der Anweundung steigt jedesmal um einige MB an.
Hm, ja aber ohne jetzt die jeweiligen Destructoren zu sehen, geh ich mal von den Standard destructoren aus und damit is klar, dass weder KlasseB noch die in KlasseB enthaltene KlasseA freigegeben wird, womit sich auch der vermehrte Ramverbrauch erklärt.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 11. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#14

Re: Objekte in Klassen: Was wird alles zerstört?

  Alt 27. Nov 2005, 11:50
Wo es geht, würde ich empfehlen, die Prodeduren "AfterConstruction" und "BeforeDestruction" zuüberschreiben, anstatt Constructor bzw. Destructor.
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#15

Re: Objekte in Klassen: Was wird alles zerstört?

  Alt 27. Nov 2005, 12:14
Warum?
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#16

Re: Objekte in Klassen: Was wird alles zerstört?

  Alt 27. Nov 2005, 12:14
Zitat von sniper_w:
Wo es geht, würde ich empfehlen, die Prodeduren "AfterConstruction" und "BeforeDestruction" zuüberschreiben, anstatt Constructor bzw. Destructor.
Danke. Scheinbar war das Objekt wohl schon zerstört, wodurch keine Zugriffe mehr möglich waren...


Danke auch an alle anderen für die Mühen
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Objekte in Klassen: Was wird alles zerstört?

  Alt 27. Nov 2005, 13:08
Zitat von malo:
Zitat von sniper_w:
Wo es geht, würde ich empfehlen, die Prodeduren "AfterConstruction" und "BeforeDestruction" zuüberschreiben, anstatt Constructor bzw. Destructor.
Danke. Scheinbar war das Objekt wohl schon zerstört, wodurch keine Zugriffe mehr möglich waren...


Danke auch an alle anderen für die Mühen
Kann es sein, dass Du im Destructor zuerst "inherited" aufgerufen hast und erst danach versucht hast Deine Objekte freizugeben?
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#18

Re: Objekte in Klassen: Was wird alles zerstört?

  Alt 27. Nov 2005, 14:04
Zitat von GuenterS:
Kann es sein, dass Du im Destructor zuerst "inherited" aufgerufen hast und erst danach versucht hast Deine Objekte freizugeben?
Ich hab im Destructor gar nichts aufgerufen. Nur die Objekte zerstört...
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#19

Re: Objekte in Klassen: Was wird alles zerstört?

  Alt 27. Nov 2005, 14:14
Tut mir leid, ich halte Vieles von dem, was hier gepostet wurde, für überflüssig und irreführend. Jede Klasse sollte sich 'um seinen eigenen Kram' kümmern, und zwar so (eigentlich ganz einfach):

Delphi-Quellcode:
type TKlasseA = class
    a: integer; //irgend ein Feld, ist ja egal, was es genau ist
  end;
  TKlasseB = class
  Private
    FKlasseA: TKlasseA;
  Public
    Constructor Create;
    Destructor Destroy; Override;
    Property ZugriffAufA : TKlasseA Read FKlasseA;
  end;
  TSuperKlasse = class
  Private
    FKlasseB: TKlasseB;
  Public
    Destructor Destroy; Override;
    Property ZugriffAufB : TKlasseB Read FKlasseB;
  end;

Constructor TKlasseB.Create;
Begin
  Inherited Create; // unnötig, schadet aber nicht
  KlasseA := TKlasseA.Create; // Was ich erschaffe ...
End;

Destructor TKlasseB.Destroy; // <--hier war ein kleiner Rechtschreibfehler
Begin
  FreeAndNil (KlasseA); // ... zerstöre ich auch wieder ...
  Inherited;
End;

Constructor TSuperKlasse.Create;
Begin
  Inherited Create; // unnötig, schadet aber nicht
  KlasseB := TKlasseB.Create; // Was ich erschaffe ...
End;

Destructor TSuperKlasse.Destroy;
Begin
  FreeAndNil (KlasseB); // ... zerstöre ich auch wieder ...
  Inherited;
End;
Vorausgesetzt, ich hab hier keinen Bockmist gemacht, klappt das Immer. Ohne BeforeDestruction oder AfterDestruction. Wenn man das als eiserne Regel befolgt ("Was ich erschaffe, zerstöre ich auch") und dann noch Resourcenschutzblöcke (Try..Finally) verwendet, baut auch sichere, also stabile und exploitresistente(re) Programme.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#20

Re: Objekte in Klassen: Was wird alles zerstört?

  Alt 27. Nov 2005, 14:21
Rechtschreibfehler:

Delphi-Quellcode:
Destructor TKlasseA.Destroy; <-- genau hier
Begin
  FreeAndNil (KlasseA); // ... zerstöre ich auch wieder ...
  Inherited;
End;
Das muss natürlich KlasseB sein.

Ich wüsste aber immer noch gern den Vorteil von BeforeDestruction vs. Destroy.
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 18:01 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