Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit FreeAndNil (https://www.delphipraxis.net/116467-problem-mit-freeandnil.html)

StinkyWinky 30. Jun 2008 07:54


Problem mit FreeAndNil
 
Hallo erstmal!

Ich habe ein Problem mit FreeAndNil().

Meine Testklasse:
Delphi-Quellcode:
type
  TTest = class(TObject)
  public
    constructor Create();
    destructor Free;
    destructor Destroy(); override;
  end;

constructor TTest.Create;
begin
  inherited;
end;

destructor TTest.Free;
begin

end;

destructor TTest.Destroy;
begin
  inherited;
end;
und folgenden TestCode:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  MyTest1, MyTest2 : TTest;
begin
  MyTest1 := TTest.create();
  MyTest1.Free;                 // <-- ruft TTest.Free auf, wie erwartet

  MyTest2 := TTest.create();
  FreeAndNil(MyTest2);          // <-- ruft TTest.Destroy auf, jedoch nicht TTest.Free
end;
Nun setzte ich in beiden Destruktoren einen Breakpoint, folgendes passiert:
  • Destruktor TTest.Free wird von MyTest1.Free aufgerufen
  • Destruktor TTest.Destroy wird von FreeAndNil(MyTest2) aufgerufen
Warum wird TTest.Free von FreeAndNil nicht aufgerufen?

Ich benutze Delphi 7.

Danke für Hinweise und Gruss
Hugo

sirius 30. Jun 2008 08:00

Re: Problem mit FreeAndNil
 
Die Methode Free wird auch von TObject bereit gestellt (übrigens ist free kein Destructor) und freeand nil ruft die Methode Free von TObject auf.
Du müsstest eigentlich auch eine Warnung bekommen, dass du eine Methode verdeckst o.ä.

spaxxn 30. Jun 2008 08:08

Re: Problem mit FreeAndNil
 
.Free ruft den destructor Destroy auf.

Diese Deklaration solltest du geschwind wieder entfernen :P

Das soll nur als Erweiterung der Erläuterung von sirius dienen.

StinkyWinky 30. Jun 2008 08:40

Re: Problem mit FreeAndNil
 
Zitat:

(übrigens ist free kein Destructor)
Danke, jetzt habe ich es verstanden!


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 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