AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wann is Class von TObject abgeleitet (FreeAndNil)

Ein Thema von norwegen60 · begonnen am 29. Mär 2020 · letzter Beitrag vom 30. Mär 2020
Antwort Antwort
Seite 1 von 3  1 23      
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#1

Wann is Class von TObject abgeleitet (FreeAndNil)

  Alt 29. Mär 2020, 18:12
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;
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Wann is Class von TObject abgeleitet (FreeAndNil)

  Alt 29. Mär 2020, 18:21
Hmm, eigentlich sollte eine Objektvariable nach FreeAndNil(Obj) immer nil sein.

Es wird letztlich
Obj.Free; und
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

AW: Wann is Class von TObject abgeleitet (FreeAndNil)

  Alt 29. Mär 2020, 18:27
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

AW: Wann is Class von TObject abgeleitet (FreeAndNil)

  Alt 29. Mär 2020, 18:30
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
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#5

AW: Wann is Class von TObject abgeleitet (FreeAndNil)

  Alt 29. Mär 2020, 18:50
Hoi, in so kurzer Zeit so viele Antworten. Corona machts möglich

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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#6

AW: Wann is Class von TObject abgeleitet (FreeAndNil)

  Alt 29. Mär 2020, 19:04
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#7

AW: Wann is Class von TObject abgeleitet (FreeAndNil)

  Alt 29. Mär 2020, 19:09
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 TestClass := nil; auch der Speicher frei gegeben wird?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#8

AW: Wann is Class von TObject abgeleitet (FreeAndNil)

  Alt 29. Mär 2020, 19:12
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
DenkDirNix

Registriert seit: 13. Dez 2018
69 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Wann is Class von TObject abgeleitet (FreeAndNil)

  Alt 29. Mär 2020, 19:14
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)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.604 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Wann is Class von TObject abgeleitet (FreeAndNil)

  Alt 29. Mär 2020, 19:28
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.
Thomas Mueller

Geändert von dummzeuch (29. Mär 2020 um 19:32 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 16:27 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