![]() |
Re: Objekte in Klassen: Was wird alles zerstört?
Zitat:
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; |
Re: Objekte in Klassen: Was wird alles zerstört?
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:
Der RAM-Verbrauch der Anweundung steigt jedesmal um einige MB an.
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; |
Re: Objekte in Klassen: Was wird alles zerstört?
Zitat:
|
Re: Objekte in Klassen: Was wird alles zerstört?
Wo es geht, würde ich empfehlen, die Prodeduren "AfterConstruction" und "BeforeDestruction" zuüberschreiben, anstatt Constructor bzw. Destructor.
|
Re: Objekte in Klassen: Was wird alles zerstört?
Warum?
|
Re: Objekte in Klassen: Was wird alles zerstört?
Zitat:
Danke auch an alle anderen für die Mühen :) |
Re: Objekte in Klassen: Was wird alles zerstört?
Zitat:
|
Re: Objekte in Klassen: Was wird alles zerstört?
Zitat:
|
Re: Objekte in Klassen: Was wird alles zerstört?
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:
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.
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; |
Re: Objekte in Klassen: Was wird alles zerstört?
Rechtschreibfehler:
Delphi-Quellcode:
Das muss natürlich KlasseB sein.
Destructor TKlasseA.Destroy; <-- genau hier
Begin FreeAndNil (KlasseA); // ... zerstöre ich auch wieder ... Inherited; End; Ich wüsste aber immer noch gern den Vorteil von BeforeDestruction vs. Destroy. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz