Wann und wie freigeben ...

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Wann und wie freigeben ...

Beitrag von Eclipticon »

Hi,

mich plagen wieder mal Alptraeume von nicht freigegebenem Speicher ;-) Wenn ich im OnCreate oder OnShow-Ereignis einer TForm Objekte erstelle (die nicht Teil der Form sind) ... gebe ich sie dann besser im OnClose-Ereignis oder in der finalization der Unit frei? Was fuer Vor- und Nachteile haben diese Varianten?

Und verstehe ich es recht, dass ich mir FreeAndNil() sparen kann, wenn ich ohnehin Objekte nirgends mit Assigned() darauf pruefe, ob schon eine Instanz erstellt wurde?

Danke!
Zuletzt geändert von Eclipticon am Mi 2. Mär 2011, 00:29, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Wann und wie freigeben ...

Beitrag von theo »

1: Das Pendant zu OnCreate ist OnDestroy
2: Afaik ja.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Wann und wie freigeben ...

Beitrag von Socke »

  • Wie theo sagt, immer Gegenteilig freigeben, also:
    • initialization -- finalization
    • Constructor -- Destructor
    • OnCreate -- OnDestroy
    • usw.
  • In dem Falle reicht sogar ein .Destroy anstelle von .Free aus; damit sparst du eine If-Abfrage pro Objekt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Wann und wie freigeben ...

Beitrag von mschnell »

Komponenten haben einen "owner", der beim Create gesetzt wird. Wenn der freigegeben wird, wird die Komponente automatisch freigegeben. Automatische Freigaben gibt es auch bei einigen Listen-Typen.

-Michael

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Wann und wie freigeben ...

Beitrag von Socke »

mschnell hat geschrieben:Komponenten
Stimmt, die hatte ich noch vergessen. Bei Komponenten macht es aber auch nichts aus, wenn man sie vorher manuell freigibt, da dann die internen Referenzen automatisch aktualisiert werden.
Bei den Listen muss man die Referenzen auch noch manuell löschen/auf nil setzen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Wann und wie freigeben ...

Beitrag von mschnell »

Bei den Listen kann man das automatische Löschen abschalten, wenn man es nicht braucht.
-Michael

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Wann und wie freigeben ...

Beitrag von Socke »

Man könnte auch automatisch referenzgezählte Interfaces verwenden.

Eine alternative wäre ein eigener Memory-Manger, der am Ende den gesamten noch nicht freigegebenen Speicher freigibt.

Ein Kommilitone würde jetzt sagen: Man kann sich auch 'ne Gewürzgurke ans Knie nageln...
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten