Create - wann nil, wann self?

Rund um die LCL und andere Komponenten
Antworten
Timm Thaler
Beiträge: 1224
Registriert: So 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

Create - wann nil, wann self?

Beitrag von Timm Thaler »

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?

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Create - wann nil, wann self?

Beitrag von MmVisual »

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.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Create - wann nil, wann self?

Beitrag von Warf »

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)

Timm Thaler
Beiträge: 1224
Registriert: So 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

Re: Create - wann nil, wann self?

Beitrag von Timm Thaler »

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?

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Create - wann nil, wann self?

Beitrag von MmVisual »

Man braucht z.B. NIL wenn man eine Unit ohne Formular schreibt und darin Elemente erzeugt die einen Owner haben.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten