![]() |
Wann is Class von TObject abgeleitet (FreeAndNil)
Hallo zusammen,
habe gerade festgestellt, dass meine Klasse nach FreeAndNil nicht sicher NIL ist. Ich habe dann in der Hilfe folgenden Hinweis gefunden: Zitat:
Delphi-Quellcode:
type
TTest = class private public constructor Create; destructor Destroy; override; end; |
AW: Wann is Class von TObject abgeleitet (FreeAndNil)
Hmm, eigentlich sollte eine Objektvariable nach FreeAndNil(Obj) immer nil sein.
Es wird letztlich
Delphi-Quellcode:
und
Obj.Free;
Delphi-Quellcode:
durchgeführt.
Obj := nil;
Der Hinweis könnte m.E. so interpretiert werden, dass Obj ein Objekt sein muss. Ein Problem könnte sein, wenn im Destructor eine Expression auftritt. Zeig vielleicht mal Dein Ursprüngliches Problem. Vielleicht lässt sich das ja aufklären. |
AW: Wann is Class von TObject abgeleitet (FreeAndNil)
Zitat:
Ich halte es auch für zielführender, du würdest dein reales Problem zeigen. |
AW: Wann is Class von TObject abgeleitet (FreeAndNil)
Zitat:
Du schreibst eine Klasse. Davon kannst du Instanzen erzeugen (mit .Create()) und du speicherst Verweise (/Referenzen) auf diese Instanzen in Variablen. Diese Verweise können nil werden. Aber wenn ein Verweis nil wird, werden nicht alle Verweise auf die gleiche Instanz auch nil. Ich vermute, du machst sowas:
Delphi-Quellcode:
var a, b: TTest;
begin a = TTest.Create(); b := a; FreeAndNil(a); // Ergebnis: a = nil b = 0x56a4bf00 // Verweist noch auf die Adresse, darf nicht mehr zugegriffen werden |
AW: Wann is Class von TObject abgeleitet (FreeAndNil)
Hoi, in so kurzer Zeit so viele Antworten. Corona machts möglich :-D
Bisher bin ich auch davon ausgegangen, dass bei keiner Angabe automatisch von TObject abgeleitet wird. Der explizite Hinweis in der Hilfe hat mich dann aber verunsichert. Wie könnte man denn dann eine Klasse erstellen, die nicht von TObject abgeleitet ist? Hier mein vereinfachtes Konstrukt
Delphi-Quellcode:
Ich hoffe das stellt das Konstrukt verständlich da
unit uTestClass;
interface type TTestClass= class private public constructor Create; destructor Destroy; override; end; var TestClass: TTestClass; implementation ... end. unit Test; interface type TTestForm = class(TForm); published procedure FormCreate(Sender: TObject); private public constructor Create; destructor Destroy; override; procedure TuWas; end; var TestClass: TTestClass; implementation procedure TTestForm.TuWas; // Wird bei bestimmtem ProzessStand von Timer immer wieder aufgerufen begin ... if not TestForm.TestClassReady then // Wenn noch nicht gestartet oder noch nicht fertig begin if TestClass = nil then TestClass := TTestClass.Create; if not TestClass.TuWasAnderesReady then begin TestClass.TuWasAnderes; Exit; end else begin TestForm.TestClassReady := true; FreeAndNil(TestClass); end; end; ... end. Wenn ich nun TTestForm beende und für einen zweiten Lauf TTestForm.Create neu erzeuge ist beim zweiten Durchlauf TestClass.TuWasAnderesReady = True Das wird bei TTestClass.Create auf false gesetzt Beim zweiten Aufruf wird TTestClass.Create aber gar nbicht aufgerufen weil nicht Nil Ich prüfe aber noch mal, ob der Fehler sich anderst einschleicht |
AW: Wann is Class von TObject abgeleitet (FreeAndNil)
Zitat:
|
AW: Wann is Class von TObject abgeleitet (FreeAndNil)
Eben. Und damit ist der Hinweis sinnfrei.
Ich schau woher das Problem kommt. Wollte das nur grundsätzlich wissen. Aber eine Frage hätte ich doch noch zu dem Thema. Stimmt es, dass alleine mit der Zuweisung
Delphi-Quellcode:
auch der Speicher frei gegeben wird?
TestClass := nil;
|
AW: Wann is Class von TObject abgeleitet (FreeAndNil)
Nein. Das ist nur dann der Fall, wenn die Klasse ein Interface mit Referenzzählung implementiert (z.B. TInterfacedObject), über eben dieses Interface angesprochen wird und die letzte Referenz auf nil gesetzt wird. Ansonsten baust Du Dir mit der nil-Zuweisung ein Speicherleck, sofern keine andere Referenz auf die Instanz mehr existiert.
|
AW: Wann is Class von TObject abgeleitet (FreeAndNil)
Zitat:
![]() |
AW: Wann is Class von TObject abgeleitet (FreeAndNil)
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 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