Zusammenräumen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Zusammenräumen

Beitrag von Vbxler »

Einen schönen guten Abend.

Ich habe eine neue Klasse erstellt, mit deren Hilfe ich Zusatzinformationen
in jede Row des Stringgrid ablegen kann, was auch bestens funktioniert:

Code: Alles auswählen

 
   //-----------------------------------------
   //Klasse für die Zusatzinfo Stringgrid
   //-----------------------------------------
   TAbfrage = class
     private
         m_Stunden        : string;
         m_Status         : string;
         m_Verwendung     : string;
     public
         constructor Create(const sStunden : string; const sStatus : string; const sVerwendung : string) ;
         property Stunden         : string read m_Stunden;
         property Status          : string read m_Status;
         property Verwendung      : string read m_Verwendung;
   end;   
Das Objekt füge dann so hinzu:

Code: Alles auswählen

sgAbfrage.Rows[iRowCount].Objects[0] := TObject(TAbfrage.Create(sStunden, sStatus, sVerwendung)); 
Und den Inhalt frage ich dann so ab:

Code: Alles auswählen

 
oAbfrage   : TAbfrage; 
oAbfrage := sgAbfrage.Rows[aRow].Objects[0] as TAbfrage; 
 
Frage: Wie und wo muss ich mich in diesem Fall um das zerstören der Instanzen kümmern?
Beim löschen eines oder aller Rows kann ich sgAbfrage.Rows[iSchleife].Free; verwenden,
aber wie mache ich es beim schliessen der Anwendung? Wer räumt als letzter zusammen?
Vbxler
-------------------------

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

Re: Zusammenräumen

Beitrag von theo »

Vbxler hat geschrieben: Beim löschen eines oder aller Rows kann ich sgAbfrage.Rows[iSchleife].Free; verwenden,
Bist du sicher?
Ich glaube nicht, dass das die Objects zerstört.
Vbxler hat geschrieben: Wer räumt als letzter zusammen?
Das Betriebssystem?

Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: Zusammenräumen

Beitrag von Vbxler »

Ich gehe schon davon aus, dass, wenn ich ein Objekt mit 'sgAbfrage.Rows[].Objects[]' hinzufügen kann,
ich mit 'sgAbfrage.Rows[].Free' das oder die Objekte zerstöre.
Ist aber nur ein Vermutung.

Wenn der Heap, ein vom OS dem Prozess zugeteilter Speicherbereich ist,
dann sollte das OS ihn auch freigeben, als sollte ich mich beim schliesses einer
Anwendung auch nicht um die Freigabe des Speichers kümmern müssen.
Vbxler
-------------------------

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

Re: Zusammenräumen

Beitrag von theo »

Vbxler hat geschrieben:Ich gehe schon davon aus, dass, wenn ich ein Objekt mit 'sgAbfrage.Rows[].Objects[]' hinzufügen kann,
ich mit 'sgAbfrage.Rows[].Free' das oder die Objekte zerstöre.
Die Logik geht nicht ganz auf. Hinzufügen und Zerstören ist kein gleiches Paar. Erzeugen und Zerstören wäre eins.
Du kannst ein Objekt ja auch noch anderweitig referenziert haben, z.B. in einer anderen Liste, dann wäre es beim Löschen des Grid einfach weg.
Nicht gut.
TStringList kennt für diese Unterscheidung das Property "OwnsObjects" http://www.freepascal.org/docs-html/rtl ... jects.html
TStrings aber afaik nicht. Also ist hier mMn Handarbeit angesagt.
Vbxler hat geschrieben: Wenn der Heap, ein vom OS dem Prozess zugeteilter Speicherbereich ist,
dann sollte das OS ihn auch freigeben, als sollte ich mich beim schliesses einer
Anwendung auch nicht um die Freigabe des Speichers kümmern müssen.
Aber anständig wäre es trotzdem. :wink:

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Zusammenräumen

Beitrag von Michl »

Zum Test kannst du doch Heaptrc nutzen?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten