Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Eigener Destruktor (https://www.delphipraxis.net/19275-eigener-destruktor.html)

ChrisM 31. Mär 2004 13:00


Eigener Destruktor
 
Hi.
Soweit ich weiß, heißt der Standard-Destruktor in Delphi Destroy, dass häufig verwendete Free ist eine einfache Procedure, welche Destroy aufruft, jedoch keine Speicherzugriffsverletzung hervorruft, wenn man sie mehrfach aufruft. Wenn ich jetzt in meiner Klasse einen eigenen Destruktor Destroy schreibe, wird dann beim aufrufen von Free automatisch mein eigener Destruktor verwendet? Sorry für die blöde Frage, aber bin noch Anfänger in Delphi.

maximov 31. Mär 2004 13:32

Re: Eigener Destruktor
 
Moin.

Wenn du den vorhandenen virtuell konstruktor mit override überschreibst, dann ist das der fall.

Robert Marquardt 31. Mär 2004 15:34

Re: Eigener Destruktor
 
Deine Vorstellung von Free ist falsch. Es ruft Destroy auf, aber ein Mehrfachaufruf wird nicht abgefangen.
Was (mit Hilfe von Compilermagie) abegefangen wird ist das bei a.Free der Aufruf unterbleibt falls a = nil ist.

maximov 1. Apr 2004 11:07

Re: Eigener Destruktor
 
Zitat:

Zitat von Robert Marquardt
Deine Vorstellung von Free ist falsch. Es ruft Destroy auf, aber ein Mehrfachaufruf wird nicht abgefangen.
Was (mit Hilfe von Compilermagie) abegefangen wird ist das bei a.Free der Aufruf unterbleibt falls a = nil ist.

Ich glaub eher deine vorstellung ist falsch :evil:

Was solld daran bitte magie sein? :
Delphi-Quellcode:
procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;
Wie soll der compiler auch wissen wann a = nil ist? er optimiert vielleicht unsinnige aufrufe, aber sonst auch nix! Self = a da self der unsichtbare data-pointer ist. Also macht es keinen unterschied ob ich
Delphi-Quellcode:
a.free;
schreibe, oder ob ich
Delphi-Quellcode:
if a<>nil then a.destroy;
mache!

Zitat:

Es ruft Destroy auf, aber ein Mehrfachaufruf wird nicht abgefangen.
Mehrfach nicht, aber da destroy virtuell ist in gewisser weise schon :wink:


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