Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Wann is Class von TObject abgeleitet (FreeAndNil) (https://www.delphipraxis.net/203827-wann-class-von-tobject-abgeleitet-freeandnil.html)

norwegen60 29. Mär 2020 17:12

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:

Mit FreeAndNil stellen Sie sicher, dass eine Variable nach der Freigabe der Objektreferenz nil (Delphi) bzw. NULL (C++) ist. Im Parameter Obj wird eine Variable übergeben, die ein Objekt repräsentiert.


Warnung: Obj muss eine Instanz einer von TObject abgeleiteten Klasse sein.
Meine Frage ist nun, ob folgende Klasse als von TObject abgeleitet gilt:
Delphi-Quellcode:
type
TTest = class
private
public
  constructor Create;
  destructor Destroy; override;
end;

stahli 29. Mär 2020 17:21

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
Hmm, eigentlich sollte eine Objektvariable nach FreeAndNil(Obj) immer nil sein.

Es wird letztlich
Delphi-Quellcode:
Obj.Free;
und
Delphi-Quellcode:
Obj := nil;
durchgeführt.

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.

Uwe Raabe 29. Mär 2020 17:27

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
Zitat:

Zitat von norwegen60 (Beitrag 1460758)
Meine Frage ist nun, ob folgende Klasse als von TObject abgeleitet gilt:

Alle Klassen (class) sind von TObject abgeleitet, selbst wenn das nicht ausdrücklich da steht. Aber FreeAndNil hat einen typlosen Parameter, dem man so ziemlich alles übergeben kann. Intern wird das als Instanzvariable einer Klasse behandelt und die wird auf nil gesetzt.

Ich halte es auch für zielführender, du würdest dein reales Problem zeigen.

jfheins 29. Mär 2020 17:30

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
Zitat:

Zitat von norwegen60 (Beitrag 1460758)
habe gerade festgestellt, dass meine Klasse nach FreeAndNil nicht sicher NIL ist.

Das ist jetzt vll. übermäßig penibel, aber deine Klasse kann nicht nil werden.

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

norwegen60 29. Mär 2020 17:50

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:
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.
Ich hoffe das stellt das Konstrukt verständlich da

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

DeddyH 29. Mär 2020 18:04

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
Zitat:

Wie könnte man denn dann eine Klasse erstellen, die nicht von TObject abgeleitet ist?
Überhaupt nicht. TObject ist die Mutter aller Klassen, d.h. jede andere Klasse ist letzten Endes von ihr abgeleitet, egal wieviele Hierarchiestufen dazwischenliegen.

norwegen60 29. Mär 2020 18:09

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:
TestClass := nil;
auch der Speicher frei gegeben wird?

DeddyH 29. Mär 2020 18:12

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.

DenkDirNix 29. Mär 2020 18:14

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
Zitat:

Wie könnte man denn dann eine Klasse erstellen, die nicht von TObject abgeleitet ist?
Das geht laut Doku mit dem Schlüsselwort "object", siehe unter "Object Types" in

http://docwiki.embarcadero.com/RADSt...jects_(Delphi)

dummzeuch 29. Mär 2020 18:28

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
Zitat:

Zitat von DenkDirNix (Beitrag 1460768)
Zitat:

Wie könnte man denn dann eine Klasse erstellen, die nicht von TObject abgeleitet ist?
Das geht laut Doku mit dem Schlüsselwort "object", siehe unter "Object Types" in

http://docwiki.embarcadero.com/RADSt...jects_(Delphi)

Wow, die guten alten Turbo-Pascal Objekte sind inzwischen offiziell dokumentiert? Ich dachte, die hätten schon seit 20 Jahren den Status "der Compiler unterstützt sie noch, aber wenn Du ein Problem hast, hast Du halt Pech gehabt". Manchmal wären die echt noch praktisch, aber ich traue mich nicht, sie einzusetzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 Uhr.
Seite 1 von 3  1 23      

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