AGB  ·  Datenschutz  ·  Impressum  







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

FreeAndNil macht Probleme

Ein Thema von Benmik · begonnen am 27. Sep 2020 · letzter Beitrag vom 27. Sep 2020
Antwort Antwort
Benmik

Registriert seit: 11. Apr 2009
544 Beiträge
 
Delphi 11 Alexandria
 
#1

FreeAndNil macht Probleme

  Alt 27. Sep 2020, 13:20
Delphi-Version: 10.3 Rio
Ich habe hier eine Unit mit einer Klasse, von TObject abgeleitet, nichts Besonderes mit einer Anzahl von Feldern und Prozeduren/Funktionen, die ungefähr 10 Klassen der gleichen Unit beherbergt. Diese Unit hat
Delphi-Quellcode:
procedure Clear;
procedure Free;
constructor Create;
Diese Unit habe ich nun in mein Programm eingebunden. Alles lief ohne Probleme, bis es auf einmal wüste Meldungen von FastMM hagelte, Hunderte von Speicherlecks. Ich habe mir einen Wolf gesucht, aber die Objektinstanz wurde immer ordnungsgemäß freigegeben. Endlich kam ich auf die Idee, einen Haltepunkt bei Free zu setzen.

Und da kam Folgendes raus: Wenn ich Objekt.Free geschrieben hatte, wurde die Prozedure auch durchlaufen. Aber nicht bei FreeAndNil(Objekt) . Als ich alles zu Free geändert hatte, gab FastMM sofort Ruhe.

Ist sowas bekannt? Ich habe meiner Erinnerung nach nichts an den Projektoptionen geändert, und in dem sonstigen Code kommt häufig FreeAndNil vor. Was sagen die Experten?

Vielleicht sollte ich noch sagen, dass mir meine Rio 10.3.3-Installation sowieso etwas merkwürdig vorkommt. Die roten Fehler-Krickel fehlen; Haltepunkte werden manchmal ignoriert, bis ich neu erzeuge; und bei einem Haltepunkt ist der Debugger nicht selten schon deutlich weiter. STRG + # funktioniert laufend nicht (-> Rechtsklick hilft). Vermutlich sagen jetzt alle, öh, neu installieren, aber kann das mit FreeAndNil so einfach sein?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: FreeAndNil macht Probleme

  Alt 27. Sep 2020, 13:27
procedure Free; ganz klar. Implementierungsfehler.
Du überschreibst Free ohne anzugeben das du die bestehende Methode überschreiben willst (Weiß jetzt nicht ob Free als virtuel/dynamic definiert).
Auch sollte man nicht Free überschreiben sondern den Destruktor Destroy.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
544 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: FreeAndNil macht Probleme

  Alt 27. Sep 2020, 13:35
TObject.Free kann nicht überschrieben werden, da es keine virtuelle Methode ist. Auch füge ich natürlich ein "inherited" an. Das alles erklärt aber nicht, warum meine Methode bei Free aufgerufen wird, bei FreeAndNil aber nicht. FreeAndNil ist doch überhaupt nichts anderes als ein Free mit nachfolgendem  := nil .
Und warum Destroy ??
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.183 Beiträge
 
Delphi 12 Athens
 
#4

AW: FreeAndNil macht Probleme

  Alt 27. Sep 2020, 13:44
FreeAndNil kennt "Dein" Free nicht!
Wie soll es das dann aufrufen?

Nunachmal: Überschreibe Destroy, welches vom Free und somit auch vom FreeAndNil aufgerufen wird.

Genauso wie man beim TComponent alle Initialisierungen ins überschriebene Create(Owner) reinmachen muß, denn nur Dieses kennt die VCL/FMX und nur das kann beim Laden der Form aufgerufen werden.
"Zusätzliche" Create, mit weiteren Parametern für ein manuelles Erstellen, sind dort OK, aber beim Free/Destroy gibt es da keine Kompromisse/Alternativen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (27. Sep 2020 um 13:46 Uhr)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
544 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: FreeAndNil macht Probleme

  Alt 27. Sep 2020, 13:57
OK, folgende Änderungen:
Delphi-Quellcode:
      procedure Clear;
      destructor Destroy; override;
      constructor Create;
Delphi-Quellcode:
destructor TEXIF.Destroy;
begin
  FreeAndNil(FDStream);
  inherited;
end;
Jetzt meldet sich FastMM mit der schon bekannten langen Liste von Lecks, obwohl es kein FreeAndNil gibt. Mit dem einfachen bisherigen Free sagt FastMM nichts.

EDIT: Bitte um Verzeihung, funktioniert doch. In Destroy hätte viel mehr stehen müssen als nur der FDStream.
Ich danke euch beiden. Verstehe es aber trotzdem nicht ganz: FreeAndNil setzt die Referenz auf nil und ruft dann Free auf. Wieso muss der Compiler dann mein (?) FreeAndNil kennen?

Und nebenbei: Wie machst du den durchgestrichenen Text, Himitsu?

Geändert von Benmik (27. Sep 2020 um 14:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

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

AW: FreeAndNil macht Probleme

  Alt 27. Sep 2020, 14:24
Ich danke euch beiden. Verstehe es aber trotzdem nicht ganz: FreeAndNil setzt die Referenz auf nil und ruft dann Free auf. Wieso muss der Compiler dann mein (?) FreeAndNil kennen?
Du hast ja Free nicht überschrieben (weil unmöglich - überschreiben geht ja nur bei virtuellen Methoden)

Wenn du dir FreeAndNil anguckst, steht da:
Delphi-Quellcode:
procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;
D.h. .Free wird auf eine Variable von Typ TObject aufgerufen. Und das ist OK, denn TObject is ja hinreichend.

Nur ohne das override wird hier auch immer TObject.Free aufgerufen. Nur bei virtuellen Methoden wird hier nachgeuckt, ob die Methode überschrieben wurde.
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:51 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