Create - wann nil, wann self?

Rund um die LCL und andere Komponenten

Create - wann nil, wann self?

Beitragvon Timm Thaler » 1. Jan 2019, 20:20 Create - wann nil, wann self?

Ich hangele mich gerade an einigen Beispielen entlang und finde dazu wiedersprüchliche Informationen: Wann verwende ich bei einem Create ein nil und wann ein self? Oder ist das egal?

Code: Alles auswählen
tHNDtimer := TTimer.Create(nil)// Timer erzeugen
wHNDcolor := TColorDialog.Create(nil)// Farbdialog öffnen
wHNDdlg := TOpenDialog.Create(nil)// OpenDialog öffnen
xHNDconf := TXMLConfig.Create(nil)// ConfigFile öffnen


Und wo wir schonmal dabei sind: Was ist der Unterschied zwischen Free und Destroy? Oder ist das auch egal?
Timm Thaler
 
Beiträge: 871
Registriert: 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded | 
CPU-Target: Raspberry Pi 3
Nach oben

Beitragvon MmVisual » 1. Jan 2019, 20:40 Re: Create - wann nil, wann self?

Mit der Übergabe wird der Verantwortliche für den Speicher übergeben. Also wenn man "Self" übergibt, und das wird destroyt, dann destroyt es auch Deine Komponente mit. Wenn das mit NIL erzeugt wird, dann bleibt es im Speicher, bzw. Du musst es selbst mit Free frei geben.
MmVisual
 
Beiträge: 1056
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Warf » 1. Jan 2019, 21:06 Re: Create - wann nil, wann self?

Was du meinst ist der Owner der TComponent klasse. Ein Component kann weitere Components managen, indem man diesen den Subkomponenten als owner zuweist. Wird der Owner zerstört werden auch alle Komponenten die ihm zugewiesen wurden zerstört.

In einer Standard LCL Anweisung haben die meisten Komponenten die Application oder die Form als Owner. Da sobald die Application zerstört wird das Programm meist eh endet, macht der owner grundsätzlich da keinen unterschied (bei Programmende wird eh der gesamte Speicher aufgeräumt). Ist aber etwas unschön da diese Komponenten dann im Heaptrace auftauchen.
Sauberer ist es also entweder einen Sinnigen Owner zu setzen (z.B. ein Dynamische Button der in einem Panel liegt welches eventuell wieder gefreed wird würde es sinn machen das Panel als owner zu nehmen) oder per Hand aufzuräumen. Eine Form als Owner zu übergeben (z.B. über Self) ist, da die Forms zusammen mit der Application bei Programmende zerstört werden) ist also grundsätzlich funktional nutzlos, räumt aber den Heap auf, was das finden echter Memory leaks mit heaptrace einfacher macht (da man nicht zuerst sich durch alle false positives suchen muss)
Warf
 
Beiträge: 1081
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Timm Thaler » 1. Jan 2019, 21:19 Re: Create - wann nil, wann self?

Also wenn ich bei FormClose sowieso StopTimer aufrufe, in dem ein tHNDtimer.Free aufgerufen wird, isses egal. Aber mit self isses besser, weil es dann nichts macht, wenn ich das Free vergesse?

Und wenn ich sowas mache...

Code: Alles auswählen
  try
    wHNDdlg := TOpenDialog.Create(nil)// OpenDialog öffnen
    wHNDdlg.Filename := devfile;
    if wHNDdlg.Execute then begin
      devfile := wHNDdlg.Filename;
      ...
      end;
    end;
  finally
    wHNDdlg.Free();
  end;
 


...isses auch egal, aber self ist besser?

Wann nehme ich dann nil?
Timm Thaler
 
Beiträge: 871
Registriert: 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded | 
CPU-Target: Raspberry Pi 3
Nach oben

Beitragvon MmVisual » 1. Jan 2019, 21:27 Re: Create - wann nil, wann self?

Man braucht z.B. NIL wenn man eine Unit ohne Formular schreibt und darin Elemente erzeugt die einen Owner haben.
MmVisual
 
Beiträge: 1056
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste

porpoises-institution
accuracy-worried